[過去ログ] Perlについての質問箱 64箱目 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
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 もあるよ。
985: 976 2021/03/11(木)11:15 ID:VAAe2gi6(1) AAS
みなさん、こんなアホに付き合ってもらってありがとうございます。
疲れてたのかな、俺。

まだ試してませんが、教えていただいたやり方でチャレンジしてみます。
1-
あと 17 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.014s