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/
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とか拡張子をつけるのが普通なんじゃないの?
2020/05/30(土) 00:31:15.77ID:pcDYqVj5
ソースは付ける
実行ファイルは付けない
スクリプトはソースよりも実行ファイル寄り
2020/05/30(土) 00:42:58.21ID:h6ZQaP0H
拡張子つければ伝わるであろう情報を削るとか
一人で管理してるサーバならいいけど
そうじゃなきゃ害悪だと思う
2020/05/30(土) 01:44:27.37ID:UYDx2q8r
人間がエディトするファイルは付ける
人間がエディトしないファイルは付けないんじゃないの?
2020/05/30(土) 01:51:00.93ID:h49XlInt
運用においては、実行ファイルの実装方法なんかどうでもいい。
むしろ、実装方法を変えたら、ファイル名も変わるほうがはるかに害悪。

たとえば、シェルスクリプトをPerl スクリプトに変えただけで、そのスクリプトを使っているところをすべて変更しないといけなくなる。
440デフォルトの名無しさん
垢版 |
2020/05/30(土) 03:26:43.00ID:k7WMMDxu
昔々 MS-DOS (更にそれの元になった CP/M)はファイル名に固定で3文字の拡張子があり、
それによって実行ファイルかどうかを判定していて、Windows はそれを引き継いでいるので
拡張子を使っているだけ。

UNIX系OSはそもそも拡張子という概念はなく、実行ファイルは実行パーミッションのビットが
立っているかどうかで判定していた。C言語のソースに .c を付けたりはするが、あれは拡張子
ではなく接尾辞で主に人間やそれを読むコンパイラ等がファイルの種別をファイル名から判断
するためにある。だからOSから見たら .c の部分に特別な意味はなくファイル名の一部でしかない。

Windows だと例えば .exe のファイルなら .exe を抜いた拡張子なしのファイル名を指定して
OSに実行させる事は可能だが、これはOSが拡張子部分を特別扱いしているからだ。
UNIX系OSではそのような方法では実行できずファイル名を全て指定する必要がある。xxx.pl なら
xxx.pl と指定する必要があり xxx のみでは実行できない。その代わり実行パーミッションが立って
いればファイル名がどうであろうともOSはそれを実行しようとする(実際に実行できるかどうかは
ファイルの内容による)。
2020/05/30(土) 08:54:37.07ID:Noe/rV9t
拡張子が無くても判定できるようにすればいいんじゃないの? Emacs みたいに。
2020/05/30(土) 12:16:10.21ID:h49XlInt
>>441
つ fileコマンド
2020/05/30(土) 13:18:31.04ID:9sn/rA++
>>439
運用のために保守は犠牲にするんですか?
2020/05/30(土) 13:58:45.71ID:h49XlInt
>>443
実装の変更は、保守の範囲ではない。
二次開発かな?w
2020/05/30(土) 15:56:11.11ID:CwCZ2prN
>>440
シェバン知らず?
2020/05/30(土) 18:54:59.01ID:h49XlInt
>>445
>>440はその前の話やろ。
シェバンがあるだけで、テキストファイルが勝手に起動されたら恐ろしいわ。w
2020/05/30(土) 19:43:41.34ID:GvMJ9/EG
>>432
おじいちゃん(´・ω・`)
2020/05/31(日) 02:15:32.98ID:MeZ7svrP
言語変えて作り直すって、俺の感覚ではシステム置き換えのイメージだわ
コンパイル済みのバイナリならともかく、スクリプト言語動かすって環境づくりも入るじゃん
449デフォルトの名無しさん
垢版 |
2020/05/31(日) 02:44:16.68ID:pTVQa+4z
>>445
>>440に書いてあること読んでないだろ。
2020/05/31(日) 03:40:37.55ID:qe5b9Icc
その前って何?
だからシェバン使えば拡張子なんか使う必要はないってことだよ?
>>439みたいな書き換えはいらないってことを言ってる
あと自演して書き込みは見苦しいぞ
2020/05/31(日) 04:22:23.87ID:fhA8y4ka
読解力理解力がなくて、複数から指摘されたからって、自演扱いで返すとは見苦しいぞ。
452デフォルトの名無しさん
垢版 |
2020/05/31(日) 05:26:43.75ID:pTVQa+4z
>>450
それ何のOSでの話?
453デフォルトの名無しさん
垢版 |
2020/06/11(木) 19:05:11.82ID:5cioSHJn
「local $| = 1;」と言う記述見たんですけど、
「$|」の局所化って意味あるのでしょうか?
ただ単に「$| = 1;」と等価であり「local」を記述しても無駄な気がするんですけど、
私の勘違いでしょうか?

「local $| = 1;」とやることで、
そのファイルの出力だけみたいな感じになるのですか?
となると、
同プロセスなのに標準出力バッファが出力毎に別個に用意されてる事になってしまいますよね?

分かるかた教えてください。
2020/06/11(木) 19:32:41.35ID:zOJFiWlV
>>453
スコープを抜けたときに、もとの値に戻る。
2020/06/11(木) 19:37:09.97ID:YKNmcAQr
横からだけど知らなかった…
毎回もとの値別変数で退避してた
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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