【古典的モダン】Perlについての質問箱 51箱目
かつて一斉を風靡したPerlについての当時のモダンな質問をするための質問箱です。
【一つ前のスレのテンプレ】当時の状況を鑑みまた芸術作品であることに配慮して原文のままとした。
【モダン推奨】Perlについての質問箱 50箱目
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perl の区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://hibari.2ch.net/php/ )
回答する際はモダンな方法でお願いします
(例 jcode.plではなくEncodeモジュールを使った方法)
理由はもう2012年です。いい加減2000年以前の方法はやめましょう。
最新のPerlを使うほうがかっこいいです。
いつまで勉強しないつもりですか?
過去にとらわれるのはもうやめです。進歩しませんよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。
http://www.perl.org/get.html
● 2011/10/30 現在の最新版: 5.14.2
▼ 前スレ
Perlについての質問箱 49箱目
http://toro.2ch.net/test/read.cgi/tech/1319953460/
リンク集は >>2-3辺り
Perl 日本語処理の基礎の基礎 >>4辺り >>130
そこはシェルとかPHPもあるからそんなに問題ではないと思うけどな
文字列に変数埋め込みの時にもそのままかける利点もある
変数を視認しやすいから読む時はかなり便利だよ 予約語を区別しなくてよい利点も。
Cとかで予約語を識別子として書くとわけのわからないエラーになりがち。
シェルは逆に、組み込み変数が多すぎて混乱することもある。
Perlはほどほどでいい落としどころ。 どう見ても予約語なものを変数名にして、
それはそれで動くけどエディタが間違って色を付ける スクレイピングしたいんですけど何を勉強すればいいですか
不正アクセスに問われたりしないでしょうか?
セキュリティ対策はどのようなことに注意すればよいでしょうか? httpsでいきなり躓くので、新しい言語の方がいいのでは threads->create しながら detach しながら、
前のスレッドがdetachするちょっと前に次のスレッドを作って、
基本的には1つしか動いてない
みたいな動作のまま放置すると、そのうちスレッドの作成に失敗するようになる
オーバーラップさせようとしている期間だけ失敗して、前のスレッドが無くなると成功する
そのままさらに放置すると、スレッドが全く作成できなくなる
何かが溜まっていって上限に達してるように見えるけど、何か制約ある? %hash = { key => value };
みたいに書いてエラーになる原因は絶対pythonだ ハッシュにリファレンスを入れるとどうやって使うんだ?
別にエラーにはならないんだよな >>142
use warnings プラグマ指定されてると、Reference found where even-sized list expected at XXX.pl line YYY. みたいな警告が出るけど $item = $item[$i];
みたいな書き方してると、移植する時に困るな $item = $items[$i];
とか
foreach my $item (@items){
はよく見る。 $item{$key}だと思ったら、$item->{$key}で、
うっかり$itemも使って書き換える、というのが自分のバグ原因1位 0〜9と+-以外の文字が含まれている場合は入力制限としたい場合
my $data = "-23456";
if($data =~ /[^0-9+-]/){
print "入力制限";
}
とやっても入力制限になってしまいます
どうやればいいんですか? マイナス記号ってさ、 [] の中だと a-z と書いて a から z の意味にしてたりするじゃない。だから \- にしといた方が良いんだよ。
その例のように最後に使うなら大丈夫だろうけどね。
プラス記号に関しては [] の中だと任意の1文字の意味は消えてるように思うけど念のため \+ にしといた方が良いような気がする。(調べてない) 難しいこと考えず記号を全部エスケープしときゃいいんだよ
へたに救済ルールがあるせいで混乱する チェッカーにかけるとエスケープしなくていいものをエスケープしてると指摘される sed使うときは-Eオプション使うとマシになるよ
grepなんか-Pオプションなんてあるし grepは今でも普通に使う
perlより圧倒的に速い MINGW版のgrepは-Pオプション使えないんだよなあ うちのは使えるみたいだな
$ grep --version
GNU grep 2.5.4
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ grep --help | egrep '(-P|-o)'
-P, --perl-regexp PATTERN is a Perl regular expression
-b, --byte-offset print the byte offset with output lines
-o, --only-matching show only the part of a line matching PATTERN
-u, --unix-byte-offsets report offsets as if CRs were not there (MSDOS)
$ uname
MINGW32_NT-6.2 'grep' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。 MINGWではなくGit for Windows 2.35.1.2のMSYSに訂正
C:\Program Files\Git\usr\binにPATHを通している
>uname
MSYS_NT-10.0-19041
>grep --version
grep (GNU grep) 3.0
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
>grep -P foo
/usr/bin/grep: -P supports only unibyte and UTF-8 locales
以下、Chocolateyのgrepの場合
>grep --version
grep.exe (GNU grep) 3.7
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Mike Haertel and others; see
<https://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
Patched by: Michael M. Builov <mbuilov@gmail.com>.
>grep -P foo
grep.exe: Perl matching not supported in a --disable-perl-regexp build 失礼
環境変数に LC_CTYPE=ja_JP.UTF-8がセットされてなかっただけらしい Chocolateyのgrepは環境変数に LC_CTYPE=ja_JP.UTF-8がセットされててもダメ
grep --helpコマンドで-Pオプション表示されるけど実際には使えない Git for Windowsのgrepはおまけみたいなもんやろ。
しゃあない。
Git以外も使うんならMSYS2にするべき。 部分マッチ情報とか付いた$_が任意のコードブロックに渡せるし普通にgrepより強い、perlっぽいし
ただし内部コマンドなのが玉に瑕
bashとかの非標準シェルを使ってるとpwsh -cにパイプや引数で渡す必要があるし、$_等のシェル変数使うから後で参照できねえ WSL2, Ubuntu 18.04 では、
grep --version
grep (GNU grep) 3.1
-P, --perl-regexp
PATTERN を Perl の正規表現として扱います。
きわめて実験的なものなので、
grep -P を使うと、その機能は実装されていません、という警告が出るかもしれません windows版だけの問題なのか?
gnu grepの-Pはもう少なくとも十年以上その表記
そもそもundocumentedだが、サブパターンのネスト、バックトラック切り、アサーション周りが怪しい
windows使ってるなら標準コマンドのselect-stringを使え
(?>)(?<=)(?<!)(?=)等表記も標準的
-r相当のオプションは無いけどgciがfind同等のコマンドだからパイプするのがイディオム(未テスト)
> get-childitem /some/where -recurse -depth 1 |select-string [-opts] "pat"
windowsでbash使ってるなら多分こんな感じになるだろう
bash$ perl -E 'say "@INC"; ' |pwsh -c '
$input -split " " |gci -r -d 1 -inc "*.pod" -exc "*delta*" |sls "^=head NAME"
'
汚なくて嫌ならperlを使え、そのためのPerlだ あ、最後のslsに -contextが抜けてた
sls -con 2 "..."でname - descrを表示する意図だった、念の為 薄めのORMない?小さめのスクリプトにはDBICいくらなんでも重すぎる 未だにpythonで
push array, value
とか書いてエラーになる
正しくは
array.append(value)
どうにも窮屈だな push = lambda a,v: a.append(v) lambdaに名付けるとリンタに怒られるんだっけか
push = list.append
push (array, value)
が多分真っ当でたぶん動く