[過去ログ] Perlについての質問箱 64箱目 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
916: 2021/01/03(日)21:44 ID:fvS6UGyp(2/2) AAS
>>914
クエリパラメータ追加するなり工夫すれ
917: 532 2021/01/25(月)02:03 ID:NGykvctj(1) AAS
外部リンク:perlcodesample.hateblo.jp
918(1): 2021/02/13(土)20:39 ID:puXqs/bZ(1/2) AAS
U+10000からU+1FFFFまでの文字があったら置換したい時はどう書けばいい?
919: 2021/02/13(土)20:57 ID:aGYlIUX0(1) AAS
>>918
s/U¥+(1¥x{4})/pack(q{U},$1)/eg
とかか?
外部リンク[pod]:perldoc.jp
920(1): 2021/02/13(土)21:54 ID:puXqs/bZ(2/2) AAS
あー
U+10000という文字列を置換したいのではなく、それが示すサロゲートペアを置換したい
921: 2021/02/14(日)01:36 ID:u5RUQBwf(1/2) AAS
>>920
s/([¥x{10000}-¥x{1ffff}])/unpack(q{U},$1)/eg
かな?
ダメな気もするが。
つーか、さっきのURLにいろいろ書いてあるから、一度目を通して自分で試してみろ。
んで、うまくいったら、結果を貼るようにな。
922: 2021/02/14(日)07:32 ID:kRUK3Bbl(1) AAS
$line =~ s/\x{1f306}/置/g;
これは成功する
$line =~ s/\x{1....}/置/g;
こんなことをやろうとしてた
$line =~ s/[\x{10000}-\x{1ffff}]/置/g;
これが正解だった
923(1): 2021/02/14(日)10:00 ID:yrV2Bu9C(1) AAS
Perlの場合、マルチバイト文字で正規表現を正しく使うには、あらかじめEncode::decode()でデコードしておく必要があるので厄介。
924: 2021/02/14(日)11:18 ID:u5RUQBwf(2/2) AAS
>>923
Perlに限らんやろ。
エンコーディングをまったく気にせず対応している処理系なんか存在しない。
925(1): 2021/03/03(水)18:48 ID:Q9ky3RP3(1/2) AAS
start:aaa1
end:bbb1
value:1.23
start:aaa2
end:bbb2
value:2.34
…
データとして上記のようなstart,end,value値が違うデータがだらっと繰り返ししてるファイルがあって
下記の正規表現で名前付きキャプチャを使って繰り返しマッチングし%+ハッシュを配列に格納したいのですが、こんな感じでやるとそれぞれのデータが順に入ってしまいます。
どう書けばマッチングした各ハッシュを配列に格納出来るのでしょうか?
$re=qr|start:(?<start>\S+).*?end(?<end>\S+).*?value:(?<value>\S+)$|sm;
my @data = m|$re|g =~ $txt;
926(1): 2021/03/03(水)20:20 ID:DgitZS9x(1) AAS
正規表現を使うところではない気がするな。w
ちょっとおちついて、行単位で処理していけよ。
927(1): 2021/03/03(水)23:36 ID:Q9ky3RP3(2/2) AAS
>>926
そういうもんなんですか?
pythonだとre.finditerでイタレータ毎に取れるので似たような感じにperlでもどうにか出来るんだろうと思ったのですが無理そうなら諦めます
928(1): 2021/03/04(木)00:03 ID:ls8aTj6l(1) AAS
Ruby なら、
line_num = 0 # 行番号
# 行末の改行を削除して、1行ずつ処理する
results = File.foreach( "test154_data.txt", chomp: true ).with_object( [ ] ) do |line, accm|
line_num += 1
# 3行毎に、ハッシュを作って、蓄積変数に追加する
accm.push Hash.new if line_num % 3 == 1
ary = line.split( ':', 2 ) # 左からコロンで、2つに分割する
hash = accm.last # 最後の要素
hash[ ary[ 0 ] ] = ary[ 1 ]
end
p results
出力
[{"start"=>"aaa1", "end"=>"bbb1", "value"=>"1.23"},
{"start"=>"aaa2", "end"=>"bbb2", "value"=>"2.34"}]
929: 2021/03/04(木)00:11 ID:Pkas/NOZ(1) AAS
>>927
可不可の話なら、while (m/start..end/g) {...}みたいにしたらきっとできる。
しかし、オレならやらん。
Pythonは詳しくないが、たぶんそれでもやらんやろなあ。
正規表現の使いどころとしては非効率的だし、エラー対応が非現実的だし。
また、対象はファイルの内容だそうだが、ReDoSは知ってるか?
930: 2021/03/04(木)00:24 ID:u/riWi2o(1) AAS
なんで急にRubyが出てくるんだよ(呆れ
931: 2021/03/04(木)00:42 ID:2AXWpxTy(1) AAS
perlリスペクト公言言語だから敬意を評してるんじゃないかな、大目に見てあげよう
932: 2021/03/04(木)09:09 ID:8OZ033Zi(1) AAS
元がファイルだからなあ
1行ずつ分かれてるものを合体させてまた分離する、というのが無意味に見える
正規表現は柔軟性なので、使わなくていいくらいかっちりしてるものには
使わない方が安全側に倒れる
元ファイルが手書きで、無駄な改行やコメントが入ってるなら正規表現
933: 2021/03/07(日)10:07 ID:Anqe+9Rf(1/4) AAS
forkがハングする。
見えてる範囲だと、memoryの使用量が関係してかもしれないです。
firefoxを使って1G程度メモリを食わせてからスクリプト走らせると、forkが返ってこなくなる。
この時のメモリ使用量は他も併せて25%程度。閉じてから再度走らせるとちゃんと動く。
エラー値返してくれたら助かるのだけど、ハングなんで困ってます。
アドバイスいただけるとたすかります。
Strawberry perl 64bit 5.32.1
Windows10Pro 64bit version 2004
Corei3-4370, Memory 12G
934(1): 2021/03/07(日)10:45 ID:Q92Mc+WL(1/4) AAS
安定して動かないならバグっている
だいたい動くけど、ごく稀に動作がおかしい、ということがforkはある
forkがコケても動くような仕組みにすればok
935: 2021/03/07(日)10:50 ID:x9JK9zFw(1/2) AAS
そもそもWindows APIはfork()をサポートしてない。
936: 2021/03/07(日)11:48 ID:Anqe+9Rf(2/4) AAS
>>934 ありがとう。
メモリ使用量が低いと成功。
firefoxでもタブ1枚ぐらいなら成功。
firefoxでタブ(yahoo.com)10枚開くと、確実にハング。
ラクダ本にも、失敗(戻り値undef)の対処法が書いてありますね。
WindowsOSがらみなので、イロイロありそうなのは察します。
でも、forkを呼び出したらハングして帰ってこないからなぁ。
コケるというよりは、forkを呼び出さない:
if( $can_fork ) {fork;}
ってな書き方が必要になってしまう。
937: 2021/03/07(日)11:53 ID:Anqe+9Rf(3/4) AAS
追記:
perlスクリプトとfirefoxは関係ありません。
単に、デスクトップで調べものしながら、コマンドプロンプトでperlインタプリタ
を起動して作業しているだけです。連投失礼しました。
938(1): 2021/03/07(日)12:10 ID:3xq9+JKJ(1) AAS
ActivePerl の Windows 版では fork() がエミュレーションされているらしい。
実際に呼び出してみるとスレッドがひとつ増える。
中ではおおかた CreateThread() でもしてるんだろう。
939(1): 2021/03/07(日)12:24 ID:xy+MS7Fg(1) AAS
windowsで安定動作させたいならforkを使わずに自分で別スレッドか別プロセス立てるのが吉
940: 2021/03/07(日)14:22 ID:Anqe+9Rf(4/4) AAS
>>938
perldocによると、ActiveStateとMSが頑張ったらしいよ。
エミュあつかいとのことです。
>>939 ありがとう。
スレッドでするわ・・・さすがにハングはだめだわ(^^;
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と関係ない話はよそでどうぞ
上下前次1-新書関写板覧索設栞歴
あと 57 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.011s