X



【古典的モダン】Perlについての質問箱 51箱目
0001デフォルトの名無しさん垢版2021/05/26(水) 10:55:29.83ID:+WmbAELr
かつて一斉を風靡した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辺り
0131デフォルトの名無しさん垢版2021/07/24(土) 15:05:42.54ID:4z9np1w1
>>130
そこはシェルとかPHPもあるからそんなに問題ではないと思うけどな
文字列に変数埋め込みの時にもそのままかける利点もある
変数を視認しやすいから読む時はかなり便利だよ
0132デフォルトの名無しさん垢版2021/07/24(土) 18:15:48.35ID:PhK5xXRL
予約語を区別しなくてよい利点も。

Cとかで予約語を識別子として書くとわけのわからないエラーになりがち。
シェルは逆に、組み込み変数が多すぎて混乱することもある。
Perlはほどほどでいい落としどころ。
0133デフォルトの名無しさん垢版2021/07/24(土) 18:32:18.88ID:/ZN/8jbh
どう見ても予約語なものを変数名にして、
それはそれで動くけどエディタが間違って色を付ける
0136デフォルトの名無しさん垢版2021/07/30(金) 18:20:35.62ID:7AkGA5GJ
スクレイピングしたいんですけど何を勉強すればいいですか
不正アクセスに問われたりしないでしょうか?
セキュリティ対策はどのようなことに注意すればよいでしょうか?
0139デフォルトの名無しさん垢版2021/08/31(火) 19:26:38.99ID:MCrZ+tU7
threads->create しながら detach しながら、
前のスレッドがdetachするちょっと前に次のスレッドを作って、
基本的には1つしか動いてない

みたいな動作のまま放置すると、そのうちスレッドの作成に失敗するようになる
オーバーラップさせようとしている期間だけ失敗して、前のスレッドが無くなると成功する
そのままさらに放置すると、スレッドが全く作成できなくなる

何かが溜まっていって上限に達してるように見えるけど、何か制約ある?
0142デフォルトの名無しさん垢版2021/11/02(火) 20:54:35.41ID:xUGStZM6
ハッシュにリファレンスを入れるとどうやって使うんだ?
別にエラーにはならないんだよな
0143デフォルトの名無しさん垢版2021/11/03(水) 16:03:42.69ID:554LNcID
>>142
use warnings プラグマ指定されてると、Reference found where even-sized list expected at XXX.pl line YYY. みたいな警告が出るけど
0148デフォルトの名無しさん垢版2021/12/08(水) 08:57:19.95ID:5HATgl/c
$item{$key}だと思ったら、$item->{$key}で、
うっかり$itemも使って書き換える、というのが自分のバグ原因1位
0149デフォルトの名無しさん垢版2022/01/03(月) 14:11:28.15ID:dazlCfaS
0〜9と+-以外の文字が含まれている場合は入力制限としたい場合

my $data = "-23456";
if($data =~ /[^0-9+-]/){
print "入力制限";
}
とやっても入力制限になってしまいます
どうやればいいんですか?
0150デフォルトの名無しさん垢版2022/01/03(月) 14:28:13.30ID:dazlCfaS
149だけどこれでよかったです。
解決しました
0151デフォルトの名無しさん垢版2022/01/04(火) 00:39:15.19ID:A3JfSOSv
マイナス記号ってさ、 [] の中だと a-z と書いて a から z の意味にしてたりするじゃない。だから \- にしといた方が良いんだよ。
その例のように最後に使うなら大丈夫だろうけどね。

プラス記号に関しては [] の中だと任意の1文字の意味は消えてるように思うけど念のため \+ にしといた方が良いような気がする。(調べてない)
0152デフォルトの名無しさん垢版2022/01/04(火) 00:46:20.99ID:4cEZtgLZ
難しいこと考えず記号を全部エスケープしときゃいいんだよ
へたに救済ルールがあるせいで混乱する
0153デフォルトの名無しさん垢版2022/01/04(火) 14:31:56.40ID:3tVRYKmq
チェッカーにかけるとエスケープしなくていいものをエスケープしてると指摘される
0160デフォルトの名無しさん垢版2022/02/13(日) 12:48:15.74ID:4VAZuwGn
MINGW版のgrepは-Pオプション使えないんだよなあ
0161デフォルトの名無しさん垢版2022/02/14(月) 18:49:00.35ID:kp1rSO4P
うちのは使えるみたいだな

$ 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
0162デフォルトの名無しさん垢版2022/02/14(月) 19:43:31.51ID:SjaA8f+R
'grep' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
0163160垢版2022/02/14(月) 20:21:12.04ID:xbNILGkv
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
0164160垢版2022/02/14(月) 20:33:42.00ID:xbNILGkv
失礼
環境変数に LC_CTYPE=ja_JP.UTF-8がセットされてなかっただけらしい
0165160垢版2022/02/14(月) 20:39:16.14ID:xbNILGkv
Chocolateyのgrepは環境変数に LC_CTYPE=ja_JP.UTF-8がセットされててもダメ
grep --helpコマンドで-Pオプション表示されるけど実際には使えない
0166デフォルトの名無しさん垢版2022/02/14(月) 22:36:54.77ID:CumnTUFy
Git for Windowsのgrepはおまけみたいなもんやろ。
しゃあない。

Git以外も使うんならMSYS2にするべき。
0169デフォルトの名無しさん垢版2022/02/15(火) 09:33:33.33ID:CMc47lH5
部分マッチ情報とか付いた$_が任意のコードブロックに渡せるし普通にgrepより強い、perlっぽいし

ただし内部コマンドなのが玉に瑕
bashとかの非標準シェルを使ってるとpwsh -cにパイプや引数で渡す必要があるし、$_等のシェル変数使うから後で参照できねえ
0170デフォルトの名無しさん垢版2022/02/15(火) 12:43:38.51ID:LH9Iimee
WSL2, Ubuntu 18.04 では、

grep --version
grep (GNU grep) 3.1

-P, --perl-regexp

PATTERN を Perl の正規表現として扱います。
きわめて実験的なものなので、
grep -P を使うと、その機能は実装されていません、という警告が出るかもしれません
0171デフォルトの名無しさん垢版2022/02/15(火) 14:44:11.29ID:ch4uHJq0
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だ
0172デフォルトの名無しさん垢版2022/02/15(火) 14:49:23.52ID:ch4uHJq0
あ、最後のslsに -contextが抜けてた
sls -con 2 "..."でname - descrを表示する意図だった、念の為
0179デフォルトの名無しさん垢版2022/05/18(水) 23:59:05.74ID:Tv2EzwC/
未だにpythonで
push array, value
とか書いてエラーになる
正しくは
array.append(value)

どうにも窮屈だな
0181デフォルトの名無しさん垢版2022/05/19(木) 01:18:01.10ID:fIfBGhTn
lambdaに名付けるとリンタに怒られるんだっけか
push = list.append
push (array, value)
が多分真っ当でたぶん動く
レスを投稿する


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