Perlについての質問箱 64箱目

■ このスレッドは過去ログ倉庫に格納されています
2019/02/01(金) 09:44:37.18ID:1/Kr4Qjk
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板: https://medaka.5ch.net/php/

このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
荒らしはスルー推奨。

"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、
Perlの奥深さについて皆で語り合い、追求してまいりましょう。

www.perl.org/get.html
Download Latest Stable Source (5.28.1)

▼前スレ
Perlについての質問箱 61箱目
http://toro.5ch.net/test/read.cgi/tech/1381561905/
Perlについての質問箱 62箱目
http://toro.5ch.net/test/read.cgi/tech/1385039352/
Perlについての質問箱 63箱目
https://mevius.5ch.net/test/read.cgi/tech/1392820583/
336デフォルトの名無しさん
垢版 |
2020/03/11(水) 09:44:35.82ID:LRW51TqV
なるほど。
2020/03/11(水) 20:46:52.86ID:M00P+dL8
>>335
同じ変数を使い回しまくって、パフォーマンスを落とさないためやないの?
GCのないPerlならたいしてかわらんやろけど。
2020/03/11(水) 21:49:34.54ID:gWo/n1eo
>332
ウェブサーバーならbusyboxでよくね?w
数MBのメモリで動作する
2020/03/11(水) 23:17:22.77ID:k/ve+D91
>>335
クエリ結果を保持してるのはステートメントハンドラオブジェクトの方でパフォーマンス優先のためにその内部変数のリファリンスを返すのが*_arrayrefって考えればいいかな
んでselectrow_arrayrefの第1引数に文字列を渡したときは内部で毎回prepareされるので後から実行しても書き変わらないと
2020/03/12(木) 01:40:41.53ID:i54BE1kH
>>304
よくもこんな大嘘をw
2020/03/12(木) 01:44:08.97ID:NTVlQfwP
第一引数に$sth渡せるんだって思ったね
文字列しか渡したことないし
Perlはいまだに知らないことがある
2020/03/12(木) 09:49:43.58ID:05BordF4
>>339
そうですね。
DBI.pmで第1引数がリファレンス(ステートメントハンドラ)ならそのまま使用、そうでなければprepareしているところまではわかったのですが、その後の流れは同じのようでしたし、Driver.xstまで解析するのはやめておきました(^^;)
343デフォルトの名無しさん
垢版 |
2020/03/12(木) 16:51:12.87ID:XWa7Kkjq
>>340
そういう時は
How dare you?
と言う。
344デフォルトの名無しさん
垢版 |
2020/03/12(木) 16:52:32.93ID:XWa7Kkjq
あ、記号まつがえた。
2020/03/12(木) 17:18:02.38ID:+5N6GCV3
関連付けの仕組みを知らない人がいるのかな?
単にレジストリに、この拡張子はこのコマンドで実行するって書くだけなんだけど
2020/03/12(木) 17:18:57.67ID:+5N6GCV3
つまりcmd。exeから実行できるものは全て
同じやり方で関連付け作れるってことね
2020/03/12(木) 18:12:19.10ID:XQbCK6u3
それはただの起動のしくみでしかない。
実際の動作は高い壁で分離されてるといって過言でないものをいっしょくたにはできまい。
2020/03/12(木) 18:48:34.51ID:U4j5Oz8o
>>347
理由は?
2020/03/12(木) 18:49:23.71ID:U4j5Oz8o
そもそもダブルクリックできるなんて
起動の仕組みなんだから、起動の仕組みでしか無いと言われても
その話をしてるんですよとしか言いようがないがw
2020/03/12(木) 19:40:41.23ID:kpO7RyNn
だからエクスプローラからWSLにあるファイル見る方法教えてくれってw
2020/03/12(木) 19:47:21.76ID:IWxDU6vM
それは見れる \\wsl$
エクスプローラからしか見れないのが問題
2020/03/12(木) 19:57:44.60ID:MY0SLzQz
グレタちゃんもアナルパールを使ってます
2020/03/12(木) 20:49:28.83ID:U4j5Oz8o
ダブルクリックてエクスプローラーの話じゃん
エクスプローラーから見れるなら、ダブルクリックして開ける。
その証拠にテキストファイルだって開けるだろ
2020/03/12(木) 22:39:56.96ID:MY0SLzQz
グレタちゃんに僕のパイソンを貸してあげたい
2020/03/14(土) 18:16:47.41ID:jx2yED/o
active perlのcryptのsaltにasciiでない文字を渡すと止まるんだけど何で?
2020/03/14(土) 19:34:39.97ID:RPa5riWU
WSLつかえ
2020/03/14(土) 22:58:59.61ID:eh0BX5+5
>>355
理由を聞いてどうするんや?
文字コードとかややこしいから、対応してないんやろ。
2020/03/14(土) 23:16:24.90ID:5TZ0Uf7y
分からんのなら黙ってろやチンカス
359デフォルトの名無しさん
垢版 |
2020/03/14(土) 23:39:11.11ID:9VuyfYoc
暗号化って、base64 とかだろ。
ascii だけだろ

Ruby なら、こういうやつだろ

module SecureRandom
https://docs.ruby-lang.org/ja/latest/class/SecureRandom.html
2020/03/14(土) 23:44:18.11ID:jx2yED/o
keyの方は何でもokなんだけどな
2020/03/15(日) 03:21:52.90ID:ey4TMar/
>>358
わかってもなにもできんくせに
ゴミクズ
2020/03/15(日) 18:38:42.70ID:8dswEreI
グレタちゃんのクリトリスは100カラットのルビー
2020/03/16(月) 09:00:22.83ID:m2o8L3Qu
>>355
ここに書き込む前に、perldocを嫁
If using crypt on a Unicode string (which potentially has characters with
codepoints above 255), Perl tries to make sense of the situation by
trying to downgrade (a copy of) the string back to an eight-bit byte string
before calling crypt (on that copy). If that works, good.
If not, crypt dies with Wide character in crypt .

おそらく、crypt はPOSIXの仕様に合わせているから、こうなるのではないかと思う。
2020/03/16(月) 19:53:11.24ID:jMV62GuM
128-255を渡しても止まるんだけどね
エラーが出るとかじゃなくて異常終了する
仕様だとは思い難い
2020/03/16(月) 20:07:47.98ID:O3TrJAsg
「異常終了」じゃなくて、「die」してるんちゃううんか?
>>363にもそう書いてあるやろ。

トラップしたけりゃevalしろ。
2020/03/16(月) 20:22:32.11ID:jMV62GuM
die すると何かエラーメッセージ出しておとなしく終了するんじゃないのか?
windowsに怒られとるぞ
2020/03/17(火) 00:31:17.78ID:WzQFj8c+
この言語はなにが起こるかわからんので基本evalで囲わないとやってられませんね
2020/03/17(火) 00:59:40.01ID:DZYZalLc
トラップでevalってなんだっけ?w
Perlやめてから結構立つから忘れた。
なんかそんなのあったなwww

今?Perlからシェルスクリプトに回帰していますがなにか?
2020/03/17(火) 05:25:03.15ID:WzQFj8c+
>>368
これ
https://perldoc.jp/func/eval
eval BLOCKってやつ

try catchみたいなもん
2020/03/17(火) 08:02:58.85ID:sAGmKBfN
エラーが返るならtryできるだろうけど、試してみたら異常終了するようなもんも避けられるのか?
2020/03/17(火) 21:45:41.98ID:sAGmKBfN
https://i.imgur.com/T58MWmG.png
evalでもトラップできない
2020/03/18(水) 00:13:57.91ID:+5qWGdwM
man にはどう書いてあるの? Perl の crypt じゃなくて C のライブラリの方だよ。
2020/03/18(水) 01:56:55.56ID:jzX09kaS
WindowsだしActivePerlのようだし、何がおきてもふしぎじゃないな。w
2020/03/18(水) 09:12:43.24ID:SzV6uL92
Windows10、activeperl 5.20なんだけど、次のコードできちんと動く。何が問題なのか解らない。

$res = eval {crypt('aaa', 'ppp')};
print "1. $res\n";
$res = eval {crypt('aaa', 'あ')};
print "2. $res\n";
$res = crypt('aaa', 'ppp');
print "3. $res\n";
$res = crypt('aaa', 'あ');
print "4. $res\n";
__END__

1. ppFj4OYENOP9c
2. 縺VSnoxRf90hw
3. ppFj4OYENOP9c
4. 縺VSnoxRf90hw
2020/03/18(水) 19:35:06.32ID:iQ6PHWNN
Windows7とか?
2020/03/28(土) 10:30:07.37ID:gZJzrXqn
検索が遅い
いろんな条件に対してファイル全体を検索、ということをする時に、
OSのキャッシュに頼って毎回 `grep` する方が速い
メモリに読み込んで検索すると負ける
ループで$data[$i] =~ /$pattern/ した方がまだ速くて、
grep {/$pattern/} @data するともっと遅くなる

大量一括検索の高速化のテクニックみたいなの何かあるのかな
2020/03/28(土) 18:48:22.67ID:Cuxaq7bT
>>376
https://metacpan.org/search?q=grep
使った事ないが MCE::Grep 辺りは説明読む限り速そう
2020/03/28(土) 18:55:38.49ID:Cuxaq7bT
もっと基本的な話なら perlperf
https://perldoc.jp/docs/perl/perlperf.pod
2020/03/28(土) 19:23:29.33ID:gZJzrXqn
MCE::GrepはCPUの使用率は上がるけど遅くなった
grepよりは正規表現の処理のあたりが時間かかってるんだと思う

感覚的にはもっと高速でも全然おかしくない感じなのに
2020/03/28(土) 19:34:33.22ID:gZJzrXqn
100MBのファイルからパターンに合う行を全部抽出するのに1秒かかるくらいの感じ
で、パターンが250もあるから、コーヒーが飲めるくらい待たされる
2020/03/28(土) 20:00:38.86ID:L8+cmwNy
俺だったらgrepでやっちゃうなぁ
結果はファイル経由で
2020/03/28(土) 21:36:49.99ID:L89shHGR
>>376
qr//で事前に正規表現をコンパイルしてみたら?
2020/03/28(土) 21:55:00.53ID:gZJzrXqn
同じパターンで繰り返し検索するのではなくて、
いろんなパターンで同じ対象を検索するので、コンパイルはできない

でも、パターンのリストは実行前に確定しているので、
qrで作ったものを配列に持たせておけば速くなるだろうか
2020/03/28(土) 23:16:33.34ID:2U8ZKDy+
もはや perl の能力を超えているな
C とかで書いた方がいい
2020/03/28(土) 23:24:04.96ID:ZQFwrOhU
パターンの内容にもよるが、flex で書いて Inline::C で呼ぶという方法もある。
386デフォルトの名無しさん
垢版 |
2020/03/28(土) 23:25:40.33ID:7nefda3x
色んなパターンで?
grep -f でパターン読ませてやるのと同じか?
2020/03/29(日) 09:15:52.43ID:9AyQFVoq
素の Perl は NFA だけだから、どうしても速度的には不利になる。
パターンが250もあるなら尚更だ。
grep との差はPerl と C の差はもちろんあるだろうが
DFA でできるパターンなら、その差が大きいと思う。
2020/03/29(日) 09:42:19.51ID:aacnUCYv
linuxだったら素直にgrep呼べばいいだけだけど、
windowsだと素性が良くて高速なgrepを探すところでまず困難がある
さらに、grepに引数を渡すところにもエスケープ文字の困難があって、
結果の受け取りにも文字コードの困難が
2020/03/29(日) 17:43:38.29ID:9AyQFVoq
そういえば awk は DFA じゃなかったかな。
2020/03/30(月) 00:14:28.89ID:mvvN5DTM
perl の Memoize は関数全体に掛けるようですが、
ruby の @memo、javascript の memo の変数に掛けるのは新し目の使い方でしょうか
391デフォルトの名無しさん
垢版 |
2020/03/30(月) 04:32:31.95ID:PdZ6Klrm
>>388
WSLのUbuntuだとどうなのだろうか?
あれ遅い?
2020/03/30(月) 08:35:14.72ID:3FWyQXw7
NFA でなければならない理由がないなら DFA にするだけで速度 1000 倍は堅いかも。
でも Perl のままでも正規表現のチューニングは可能だ。まだやってないならね。
実際に使ってるパターンを見せてもらわないことにはなんとも言えないが。
2020/03/31(火) 12:53:45.32ID:GaEXrIp5
>>388
普通にWSLを使えばいいだけでは?
2020/03/31(火) 22:24:02.97ID:Z+pFaYZ2
win8.1のサポートが終わった頃に思い出したら使ってみよう
2020/04/22(水) 13:25:13.88ID:gkB+0fgm
@array = ($str =~ /(PAT1).+?(PAT2).+?(PAT3)/g);
みたいにすると、パターン3つ分が配列に入るけど、他にもマッチするとそれも続けて入る
できれば2次元配列になって欲しい
そんな技はある?
2020/04/22(水) 18:47:25.28ID:WLkEu+yG
そういうことをする時のセオリーはスカラコンテキストで
$str =~ /\G$pat/g
2020/04/22(水) 19:29:55.51ID:gkB+0fgm
可能?

$str = '1a2b3c1x1d2e3f1g2h3i';
を与えられて
[[a, b, c], [d, e, f], [g, h, i]]
を得るにはどうすれば
2020/04/22(水) 20:38:21.44ID:f6F85tCk
my @arr = ();
while ($str =~ /\G.+?([a-z]).+?([a-z]).+?([a-z])/g) {
  push @arr, [$1, $2, $3];
}
2020/04/22(水) 20:54:42.93ID:gkB+0fgm
[[a, b, c], [x, d, e], [f, g, h]]
になっとるよ
2020/04/22(水) 20:56:31.77ID:gkB+0fgm
でも判った
普通に$1使えばいいだけか
結果を一つずつスカラに取るんだと思ってた
2020/04/22(水) 21:01:22.02ID:gkB+0fgm
/\G.*?1(.)2(.)3(.)/g
これがやりたかったこと
2020/04/22(水) 21:27:03.82ID:gkB+0fgm
結局コードはあんまり変わらなくて、ループで
push @array, ($1, $2, $3)
にするか、後で
splice(@elements, 0, 3)
を使っていくかの違い

パターンを3つから4つに増やした時に、
$4を追加するか、3を4に増やすかのメンテはやっぱり必要
いきなり2次元配列が得られるスマートさからは劣る
2020/04/22(水) 21:30:34.59ID:WLkEu+yG
どうやら今回は必要ないみたいだけど事前にグループの個数が
判らないという前提なら @- とか見ればいい。
あるいはグループに名前を付けて %+ を使えばいい。
全部ここに書いてあるよ。
https://perldoc.jp/pod/perlretut
2020/04/22(水) 21:32:10.06ID:f6F85tCk
Perlで、とある配列を指定した要素数ごとに別の配列リファレンスに分割する処理をList::MoreUtilsモジュールで書き直してみた
https://perl48.hatenablog.com/entry/2018/08/19/005304
2020/04/22(水) 23:57:47.29ID:WLkEu+yG
名前を付けるような性格のものじゃなくて個数が変わる可能性があるなら
個数だけ与えてパターンを組み立てればいいよ。
$1,$2 とか書かなくても
map { ${$_}} 1 .. $n
で同じことができるし。
リストコンテキストで配列に入れてから splice する方がいいと思うならそうすればいい。
2020/04/23(木) 08:13:25.78ID:7CKy0JPC
目指すのは、個数がいくつなのか人間が把握しなくていいコード
2020/04/23(木) 08:30:38.98ID:IlZrBGCM
できるでしょ。自分がスマートになってスマートなコードを書けばいい。
2020/04/23(木) 12:10:21.89ID:2vqGx7d4
完全に数値って決まってるんなら、俺ならsplit使っちゃうな
@a = split /\d/, $str;
まあこんな単純な話じゃないんだろうけど
2020/05/01(金) 10:49:51.92ID:baJ3Dlo6
activeperlで
$res = `exefile $file`;
みたいなことをした時に、
コマンドプロンプトからスクリプトを起動するとちゃんと動く
でも、スクリプトをランチャーから起動するとno such fileになる
ファイル名が英数ならどちらもok
2byte文字が混じると挙動が変わる

起動の仕方によってパスの取り扱いとか変わる?
2020/05/01(金) 12:19:28.98ID:baJ3Dlo6
あ、違う
2byte文字ではなくドライブの違いだった
ネットワークドライブにあるとアクセスできない
コマンドプロンプトからならできる
2020/05/01(金) 13:08:35.22ID:baJ3Dlo6
結局、ランチャーに管理者権限が付いてるのが原因

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
EnableLUA 1 -> 0
これで解決する
perl関係ない
2020/05/01(金) 13:13:09.83ID:9YL7RFP8
ランチャー自身か、ランチャーの起動方法がよくないんやろ。
ネットワークドライブの認証(ログオン)かそのタイミングがあやしい。
2020/05/01(金) 13:13:40.55ID:9YL7RFP8
あら、自己解決?
2020/05/10(日) 19:19:00.31ID:gcVsfbhd
質問させてください。
WindowsでActivePerlを使っています。
perl で、あるファイルを、関連付けられたアプリケーションで開く
には、どのようにすればよろしいでしょうか?

例えば、xx_system('foo.txt') のようにすると、'.txt'に
関連つけられたアプリケーションで、'foo.txt'を開くような
動作を実現したいのですが。
2020/05/10(日) 21:12:47.84ID:04IHVppx
system(1, 'foo.txt');
2020/05/10(日) 22:26:25.38ID:gcVsfbhd
>>415
動きました。ありがとうございました。
417デフォルトの名無しさん
垢版 |
2020/05/28(木) 11:01:17.93ID:5kmQgXWn
最近 python を使い始めたんだけど、使うほどに perl 凄げーって思う。
perlって細かいこと気にしないでも書けるって感じ。
まあ、 python に慣れてないってのもあるけどw
2020/05/28(木) 12:00:57.19ID:yN32+nQR
細かいことを気にしないせいでバグの原因になるので、
きちっとしか書けないようにした

perlの不満を解消してもっと簡単に書けるようにしたのは、
rubyの方が正常進化だと思う
2020/05/28(木) 12:46:18.60ID:d4ggzNnr
>>418
use strict;
use warnings;
2020/05/28(木) 12:49:38.27ID:MEC8WK3T
Perl は、暗号のような記号が多いから、皆嫌う

Ruby は可読性を上げるために、それらの記号を無くそうとしている
2020/05/28(木) 13:57:57.17ID:EGYBOXys
>>420
変数の型を知るのに
宣言まで見ないとわからないのがJava
代入まで探さないとわからないのがpython
見るとその場でわかるのがperl
宗教論争は終わらない
2020/05/28(木) 14:14:16.30ID:yN32+nQR
マウスオーバーで判るようなものをいちいち書かなくても
2020/05/28(木) 19:40:22.87ID:2jhnUESo
PerlでIDEは使わないわな
424デフォルトの名無しさん
垢版 |
2020/05/28(木) 20:04:53.96ID:EYUPTTzW
んなこたーない
2020/05/28(木) 20:14:52.80ID:2jhnUESo
いやいやPerl書いてるときマウス触らんでしょ
まあ人によるんだろうが
2020/05/28(木) 20:21:04.17ID:yN32+nQR
ロジックが逆だ
perlが型が判るからマウスを触らないのではなく、
マウスを触らないで作ったからマウスなしで型が判るようになってる

MT免許だからといってATに乗ってはいけない訳ではない
427デフォルトの名無しさん
垢版 |
2020/05/29(金) 20:28:53.39ID:Ey9K/+fw
Perl の IDE って、どんなのがある?

Eclipse とか IntelliJ IDEA のプラグインで使えたとは思ったが、拡張子を .pl にしておかないと Perl だと判別してくれなくて
ただのテキストファイルと認識されちゃって使い辛いなと思ったことはあるが、もっとまともなのある?
2020/05/29(金) 20:32:29.66ID:uRkXoYhe
vscode + Perl::LanguageServer
2020/05/29(金) 20:34:34.78ID:Bk25Bwk1
サクラエディタで十分なんですよ(´・ω・`)
2020/05/29(金) 21:27:39.95ID:dZOo8Hm0
拡張子を ,pl にしないメリットってなんかある?
2020/05/29(金) 21:28:20.85ID:Bk25Bwk1
実行ファイルはpl
モジュールはpm
そんな事も知らんのか(´・ω・`)
432デフォルトの名無しさん
垢版 |
2020/05/29(金) 21:36:34.81ID:8nIWWcW2
perlはvimで書く。
お兄さんとの約束だよ。
2020/05/29(金) 21:38:26.77ID:uRkXoYhe
mattnさんはパンツ履いて
2020/05/29(金) 23:37:14.00ID:GfVaVkMA
>>430
Linuxでは、いちいち拡張子をつけないのがふつう。
中身を気にしなくてよくなる。
2020/05/30(土) 00:29:42.29ID:UYDx2q8r
>>434
cとかshellとか拡張子をつけるのが普通なんじゃないの?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況