[過去ログ] Perlについての質問箱 64箱目 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
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…
971(1): 2021/03/09(火)09:28 ID:HJK4uNxM(2/4) AAS
NTFSはUCS-2で、windowsがUTF-16
それをわざわざcp932に変換して寄越す
972: 2021/03/09(火)10:42 ID:4CK4kuWA(3/3) AAS
NTFSもUTF-16だと思うよ。
973: 2021/03/09(火)10:44 ID:SbXzcieK(1/2) AAS
>>968
> コマンドプロントの努力だけではどうしようもない。
そらそうや。
ついにcp932から離れようとする世の方向性を受けて、Perlも変わるんじゃねえの、という話。
Perl7とかでそういう話は出てないんかな?
知らんけど。
> なお、Windows向けビルドされたJavaやPerlは非システムコード文字を引数で受け取れない制約がある。
制約つーか、むしろ互換維持とかただ昔のままほったらかしとかやろ。w
974: 2021/03/09(火)10:56 ID:SbXzcieK(2/2) AAS
>>971
そのおかげで、20年以上昔からふつうにWindowsで使えてきたわけだからしゃあない。
むしろありがたかった話。
975: 2021/03/09(火)12:55 ID:NUN2sKP0(2/2) AAS
Windows 10 Home でも、Docker が出来るようになった。
ただし、Windowsの連続更新に、3時間も掛かったけど
WSL2, Ubuntu でも使えば?
漏れは、Ruby on Rails をやってる
Linux側には、日本人が作った、バージョンマネージャーのanyenv で、
rbenv, nodenv を使って、ruby 2.6.6, node 12.16.2 も入れた
Dockerでも良いし。
ただし、メモリ8GB じゃキツイ。16GB は欲しい
976(3): 2021/03/09(火)20:18 ID:BijZjsz/(1/2) AAS
正規表現のパターンの中に変数を書くとおかしくなりますが、どうしたらいいでしょうか。
やりたいこと:「hoge」の後ろがカンマか行末の場合を抽出したい
$pat = "hoge[,\$\]";
if( $str =~ m/$pat/ ){...}
こう書くと $pat が「hoge[,$]」になることはデバッガで確認できたのですが、思った通りのマッチになりません。マッチングの部分に $pat ではなく定数で「hoge[,$]」と書けばマッチングします。
どう書いたらいいでしょうか?
977: 2021/03/09(火)20:28 ID:HJK4uNxM(3/4) AAS
なんで ] だけエスケープしてるの?
978: 2021/03/09(火)20:34 ID:nUvu3sQ4(1) AAS
そういうときの為のqrですよ
979(1): 2021/03/09(火)20:36 ID:XI91xcQL(1) AAS
[]内は文字セットだからその$は行末マッチじゃないし
980(2): 976 2021/03/09(火)22:41 ID:BijZjsz/(2/2) AAS
色々やって混乱して間違った事を書いていました。
やりたいことは >>976 の通り。
>>979を見てそれならばと「$pat = "hoge,{0,1}\$"」と書いたら目的を達成できました。
お騒がせしました。
981: 2021/03/09(火)22:43 ID:HJK4uNxM(4/4) AAS
{0,1}って?と等価だよね
982: 2021/03/09(火)23:03 ID:B0uPByTP(2/2) AAS
>>980
hoge,xxxx
にはマッチしないが、ええんか?
>>976の目的と違うで。
983: 2021/03/10(水)02:28 ID:ixLG+AYE(1) AAS
hoge(,|$)
やりたいのはコレじゃない?
984: 2021/03/10(水)06:16 ID:S+G6vYN6(1) AAS
>>980
近いといえば近いが、そういう書き方をしたいなら「, で始まる文字列」じゃないか。
hoge(,.*)?$
あと、Perl には \z もあるよ。
上下前次1-新書関写板覧索設栞歴
あと 18 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.011s