[過去ログ] Perlについての質問箱 64箱目 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
941: 2021/03/07(日)14:48 ID:Q92Mc+WL(2/4) AAS
forkとか再帰呼び出しとか、魔術的で楽しいけど、大抵罠にはまる
942: 2021/03/07(日)17:38 ID:quYd9iFF(1/2) AAS
再帰はええやろ。
forkはもともとUNIX用で、Windowsとは相性が激悪なだけやから、しゃあない。
943(1): 2021/03/07(日)17:49 ID:Q92Mc+WL(3/4) AAS
階層ディレクトリを辿る、みたいなとこに再帰を使うと止まらなくなったりする
絶対止まると保証されてるとこにしか使えなくて、そういうのは別に再帰でなくてもやれる
隅々までどうなってるか判らないものに再帰は威力を発揮するけど、
そういうのは往々にして停止性が保証されない
944: 2021/03/07(日)18:11 ID:eIiM+J9a(1) AAS
それはあんたが無能だから
945: 2021/03/07(日)18:18 ID:x9JK9zFw(2/2) AAS
Perlと関係ない話はよそでどうぞ
946: 2021/03/07(日)23:39 ID:quYd9iFF(2/2) AAS
>>943
再帰終了をちゃんとできないヤツは、ループ終了もできないやろ。w
ディレクトリうんぬんに限って言えば、ファイルシステムへの知識が足りないとかか。
リンク系の。
947(1): 2021/03/07(日)23:53 ID:Q92Mc+WL(4/4) AAS
軽く考えてるけど、プログラムの停止性ってもっそい奥が深い
ゲーデルの不完全性定理と密接に絡んでる
948: 2021/03/08(月)00:03 ID:RDgJTpCR(1) AAS
tarのhオプションってよくできているよな
無限ループに陥りやすいが
949: 2021/03/08(月)00:23 ID:tQicr2bh(1) AAS
再帰処理は考えてるの楽しいよな
実装するかとなると状況次第
950: 2021/03/08(月)01:47 ID:6lKYXbK2(1/4) AAS
>>947
バグが存在しない証明は超難しいから、ふつうやらない。
かわりに、テストを必要なだけする。
それだけのこと。
原理とやらは学者に任せておけばいい。
951: 2021/03/08(月)10:04 ID:XzCJxGl3(1) AAS
ggl先生に "perl dir tree" で検索かけたら自作ページが多いね。
安心安全鉄板ライブラリとかってあるかな?
素人考えでなんだけど・・・OS別、FS別なんてあるんかの。
952(1): 2021/03/08(月)10:17 ID:SORPad+v(1/3) AAS
親にリンクしていてループするのが困るので、
全部の子に対してカウンタを持たせる、くらいしか回避方法が無いんだよな
それだと再帰でやってるうまみが無くなってしまう
953: 2021/03/08(月)12:03 ID:JySUELLY(1) AAS
素直にFile::Find使っとけ
954: 2021/03/08(月)12:34 ID:SORPad+v(2/3) AAS
dir /s の結果を使うのが一番楽
955(1): 2021/03/08(月)16:27 ID:3P7OMB5d(1/4) AAS
File::Findは処理速度が遅いのが難
956: 2021/03/08(月)17:21 ID:6lKYXbK2(2/4) AAS
>>952
リンクを不用意にたどるな。
既存コマンドでもオプションにしがちだし、ディレクトリ構成によっては死ぬくらいだから、しゃあない。
957(1): 2021/03/08(月)17:24 ID:6lKYXbK2(3/4) AAS
>>955
何と比べて?
no_chdirを指定したりしたらマシになったりしない?
958: 2021/03/08(月)17:40 ID:SORPad+v(3/3) AAS
ディレクトリならどこかにある実体のコピーだろうから、リンクなんか無しで済むけど、
より一般化したリスト構造だったら辿らない訳にいかない
だから、事前にループしていないことを確認してから処理することになって、
そのテストがループにはまる
959: 2021/03/08(月)20:06 ID:3P7OMB5d(2/4) AAS
>>957
試してみたが、no_chdirは関係ない。
File::Findは、dir /S /B コマンドのパイプ読み取りに比べて、3倍も時間がかかる。
File::Findは遅いだけでなくコールバックでユーザー変数を扱えない欠点があるから、私はFile::Findを使わない。
960(1): 2021/03/08(月)21:30 ID:3P7OMB5d(3/4) AAS
File::FindはUnix系OSで使う場合は find コマンドのパイプ読み取りと同等か少し速い。
File::Findが明確に遅いのはWindows向けにビルドされたPerlの場合のみ。
961(1): 2021/03/08(月)22:05 ID:6lKYXbK2(4/4) AAS
>>960
WindowsのどのPerl?
ひょっとしてCygwin版?
ActivePerlやMSYS2版ならマシだったり?
962(1): 2021/03/08(月)22:39 ID:3P7OMB5d(4/4) AAS
>>961
残念ながらネイティブに最適化されているはずのActivePerl や Strawberry Perl でFile::Findが遅い。
原因は知らないけどWin32APIの使い方が良くないからだと思う。
963: 532 2021/03/09(火)00:11 ID:jxvXMO9/(1/2) AAS
$^WIN32_SLOPPY_STAT じゃね?
File::FindはWindowsだと、SJISで全角「構」などの2バイト目が\(0x5c)のフォルダに遭遇すると
無限loopしたり誤動作するから、結局Wndowsでフォルダ階層を再帰的にたどるには
utf8化したperl sourceで自分でopendir, readdirして、encode, decodeせにゃならん。
964(1): 532 2021/03/09(火)00:15 ID:jxvXMO9/(2/2) AAS
別件だがWindowsではSJISで全角「構」などの2バイト目が\(0x5c)のフォルダには
perlからlstatやutimeが出来ないみたいで難儀した。
Linuxのutf8のファイルシステムと違ってWindowsのSJISファイルシステムは面倒
965: 2021/03/09(火)01:17 ID:B0uPByTP(1/2) AAS
>>962
そうやったか。。。
>>964
NTFSファイルシステム自体はUTF-16やぞ?
MicrosoftがようやくいよいよコマンドプロンプトとかNotepadとかのUnicode対応を考えはじめてるし、いずれWindows版も対応するんちゃうか。
いっそツッコんだら?
966: 928 2021/03/09(火)05:19 ID:NUN2sKP0(1/2) AAS
>>925
Ruby で、元のファイルを、CSV へ変換してみた。
データ中に、ダブルクォーテーション・カンマを入れても、正常に動く
require 'csv'
line_number = 0 # 行番号
# 行末の改行を削除して、1行ずつ処理する。蓄積変数は2次元配列
results = File.foreach( "input.txt", chomp: true ).with_object( [ ] ) do |line, accm|
line_number += 1
accm.push [ ] if line_number % 3 == 1 # 3行毎に、空配列を追加する
ary = line.split( ':', 2 ) # 左からコロンで、2つに分割する
last = accm.last # 最後の要素 (配列)
last.push( ary[ 1 ] ) # コロンの右側を、配列に追加する
end
results.unshift %w(start end value) # 先頭に、ヘッダー行を追加する
# p results
csv_str = results.map( &:to_csv ).join # 2次元配列を、CSV 文字列に変換する
print csv_str
出力
start,end,value
a_1,"b""1",1
"a,2",b_2,2.34
967: 2021/03/09(火)08:00 ID:4CK4kuWA(1/3) AAS
コマンドプロントはとっくにUTF-16対応している。出力フォントが表示に対応していないだけ。
コマンドプロントにはもう機能追加されないから Windows Terminalに乗り換えたほうがいい。
968(1): 2021/03/09(火)08:27 ID:4CK4kuWA(2/3) AAS
コマンドプロントは今でもすでに非システムコード文字(アラビア文字やハングルなど)をコマンドに引数渡しできる。
受け取る側のアプリがUTF-16形式で起動時の引数を取らなかったり、batファイルが非システムコード文字に対応していないだけ。
コマンドプロントの努力だけではどうしようもない。
なお、Windows向けビルドされたJavaやPerlは非システムコード文字を引数で受け取れない制約がある。
プログラム側で自力でbase64エンコード対応するなどして回避するしかない。
一方、Windows向けビルドされたPythonは非システムコード文字を引数で受け取ることができる。
Pythonのプラグインを作ったことある人なら分かると思うが、Pythonはインターフェース間の文字列のやりとりにUTF-16を使っている。
969: 2021/03/09(火)08:33 ID:HJK4uNxM(1/4) AAS
UTF-16も嬉しくない
970: 532 2021/03/09(火)08:45 ID:UTQZC5u1(1) AAS
NTFSってUTF-16だったのか、
しかしperlのreaddirはcp932で返してきているような気がs…
上下前次1-新書関写板覧索設栞歴
あと 32 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.011s