Perlについての質問箱 65箱目
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.32.1) ▼前スレ Perlについての質問箱 62箱目 http://toro.5ch.net/test/read.cgi/tech/1385039352/ Perlについての質問箱 63箱目 https://mevius.5ch.net/test/read.cgi/tech/1392820583/ Perlについての質問箱 64箱目 https://mevius.5ch.net/test/read.cgi/tech/1548981877/ 2以降テンプレNGワードで貼れず。 見たい人は前スレ参照してくださいな。 LinuxやmacOSのperlは、Term::ReadLineの $term->readline() で日本語などのマルチバイト文字の入力結果が文字化けしてしまうが、 cpanなどを使ってTerm::ReadLine::Gnuをインストールすることで回避できる Linuxの場合はTerm::ReadLine::Gnuをビルドするためにlibreadline-devも必要になる ttps://blog.outer-inside.net/2021/03/perl-5.34-delta.html CentOS7 だと yum install perl-Term-ReadLine-Gnu でインストールできたよ。 RPM使ってるOSはこれで行けるのではないかな。 インストールすると perl -d でのデバッグ時も Ctrl+P だの Ctrl+N だの矢印キーだの使えるようになっていいね。 Ubuntu だとこれでインストールできた。Debian 系はこれでできそう。 sudo apt install libterm-readline-gnu-perl perl 5.34.0 がmacOSのhomebrewにきたけど、cpanがなんか変 cpanだけじゃなくてperldocもだった perl5.34.0ではなくmacOSに最初から入っている古いバージョンのperlを呼び出してしまうようだ 自力で回避するには古いperlが呼ばれないようにスクリプトを書き換えるなどの作業が必要 PerlスクリプトをVSCodeで対話デバッグするにはどうしたらいいですか? 例えば、Ruby では、p, pp を付けてオブジェクトの内容を確認できるので、デバッグまではしない。 Break Point で止めたり、デバッグしたいのなら、誰かが作った拡張機能を探す require "csv" input_str = <<"EOT" -0.0,1.2.3 9..9,-0 EOT csv = CSV.new( input_str ) csv.convert( :numeric ) # 数値型へ変換する line_num = 0 # 行番号 csv.each do |row| line_num += 1 p [ line_num, row[ 0 ].class, row[ 1 ].class ] end 出力 [1, Float, String] [2, String, Integer] つまり、1.2.3, 9..9 は、型変換に失敗して、文字列のまま uby厨は死んで良いが perlもいい加減やめた方がいい言語 新規で使うなんてあり得ない Perlは「可読性?何それうまいの」的なノリでやる自分の作業用として重宝する 小規模な一次的に使うツールみたいなのは今でも新規で作ることあるけどね シェルスクリプトで書くと余計にぐちゃぐちゃで分かり辛くなったり遅くなりそうな場合とか 元々 awk や sed 駆使したシェル芸を代替するためのコマンドだから本来の地位に戻っただけとも言える ディレクトリ掘って依存設定ファイル作らないとモジュールのインストールもできない JavaScript とか Go と違って cpanm で必要なモジュール放り込めばファイル一個で雑に動くからやっつけ仕事には未だによく使う ダクトテープがダクトテープとしてよく働いてくれる、というのは最高の賛辞やろ。 キレイなことだけが誉め言葉ではない。 MediawikiのXMLをパースするプログラムを書いてるんですが、 人間が日常的に使っている[[自然言語]]を[[コンピュータ]]に処理させる一連の技術であり という文章は[[]]内の文字を<a href>タグで置換することはできたのですが、 応用例としては[[入力予測|予測変換]]、[[インプット メソッド エディタ|IME]]などの文字変換が挙げられる。 このように[[*1|*2]]と2重に入っている文字列の置換がどうしてもうまくいきません。 この場合は、<a href=*2>*2</a>と置換したいのですが、どうしたらいいでしょうか? s/[[(.*?(|(`*?))]]/$3 ? $3 : $1/ge かな?試してないけど。 なぜ、Perl のXML パーサーを使わないの? 例えばRuby なら、Nokogiri と言う、HTML/XML パーサーがある。 内部的には、Libxml2 モジュールを使っているのかな? たぶん、Perlにもあるはず s/\[\[(.*?(\|(`*?)))\]\]/$3 ? $3 : $1/ge のパターンで試してみましたが、結果は「インプット メソッド エディタ|IME」 と置換されてしまいます。 (.*?)の部分で、|以降の文字列も含めてマッチングされているようで それ以降のパターンマッチが効いてないようです。 strawberry perl が34をリリースしないのはなぜだ >>29 それ . が ` になってるよ。直してやってみたらちゃんとできたよ。 $ echo '[[インプット メソッド エディタ|IME]]' | perl -pe 's/\[\[(.*?(\|(.*?)))\]\]/$3 ? $3 : $1/ge' IME $ スクレイピングの勉強するのですが、下手するとF5アタックになるとかの法的リスクと回避法を重視している入門書ってありますか? 今の所やりたいことは、特定の市町村の5年分気温気象データを収集して自分用に加工 近所のコインランドリーの稼働データを集計して空いてる確率が高い時間帯を調べるの2つです 前者は膨大なデータを取得する必要があります 後者は10分から20分おきにアクセスすることになります 頭のおかしい人に以下のようなことを言われました >>基本、スクレイピングは営業妨害との戦い。 >>どの本にも、そう書いてある。 >>スクレイピングを推奨する本はない 具体的な書籍名を教えてください >>5 ch は、マルチポスト禁止! >>同じ質問を、複数のスレや外部のサイトに書いてはいけない どこでそんなルールが決まっているのでしょうか? socketでデータを受信すると、 データの途中に「残りバイト数」が挿入されてしまうことがあるんだけど、これはどう取り除けばいいの? 例えばこんな感じになる wtjjpodjtjtjaajjgjjaatwdjjg@gptjwttdmttjmttpwm'jajt 1f 1234567890123456789012345678901 残りバイト数(1f)を16進数で表した文字列が挿入されてる 元々こういうデータだった場合と、挿入されてこうなった場合の区別が付かない readline()でもread()でも結果は同じだった >>38 なにそれ?文字で挿入されるの?そんなの初めて聞いたなあ。送る側で入れてるだけなのでは?(そうでなければ呼んでるライブラリが何かおかしいか) socket 関係はバッファリング避けるために sysread() 使った方が良い場合があるよ。 select で入力待ちをした後で読み込みとかね。 後は気を付けるとしたらノンブロッキングにしてるかどうかかな。 activeperlからStrawberryperlへ移行を検討しているのですが、 activeperlで使用しているモジュール( Win32::EventLog::Message)が cpanから削除されておりbackpanには残っていました。 https://cpan.metacpan.org/authors/id/D/DA/DAVEROTH/ 上記から、Win32-EventLog-Message.tar.gzはダウンロードできたのですが、 当方perl初心者でStrawberryperlへのインストール方法がわからず困っております。 どなたかインストール方法についてご教授お願い致します お騒がせしました Transfer-Encording: chunked ってやつだった これかどうかを確認して別処理か…面倒くさあい >>42 そのかわりに何を勧めんの? Windowsのイベントログを扱いたいヤツに。 40です。 通常Makefile.PLでインストールするようなのですが、 上記tar.gzには、Makefile.PLがなく、 Message.pmがあるのですが、 これは、strawberryperlにはインストールできないのでしょうか? できるかどうか自分で試すしかない 他人にやってもらおうってのは虫が良すぎ my $str = "<img src=\"./test1.png\" style=\"width:100px;height:100px\">"; ./test1.pngの部分を./test2.pngに置換するにはどうやればいいんですか? my $str =~ s/test1.png/test2.png/g;というのじゃなくてtest1.pngの部分がどんな 画像URLでも置換できるように s/src=".+?"/src="test2.png"/ {a}ab{abc} {}で囲まれたaだけdに置き換えたい どうやればいいんですか? {d}ab{dbc}になればいいってこと それだけじゃ分かんない 全ての条件を書かないと それが解なんだけどね 本当にやりたいのは my $line = "<img src='aaa.png' width='300' height='200'> 画像説明"; <>の中にある全ての を半角スペースに置き換えたいっす 実行結果は<img src='aaa.png' width='300' height='200'> 画像説明となればいいっす 送信したときブラウザが勝手に半角スペースを に変換しちゃうみたいなのでタグ内の半角スペースだけ元に戻したいから sub f { my $s = shift; $s =~ s/ / /g; return "<$s>"; } $line =~ s/<(.+?)>/f($1)/eg; sub f { my $s = shift; $s =~ s/&#160;/ /g; return "<$s>"; } $line =~ s/<(.+?)>/f($1)/eg; printで出力すると/nで改行できません 二重引用符で括ってもできません なにをやっても/nがそのまま表示されます 調べても二重引用符で括れとか〈br〉とかしか出てきません 斬新な質問だ。w 斜めの縦棒を日本語キーボードで入力しろ、と言われたらたしかにそうなるかもだが。 >>58 やはり \ (\x5c) の歴史的な事情を知らないと分からないのだろうな。 ¥マークを\に変えたらできました 紛らわしいもんですね 逆スラッシュは、日本語・Windows 用のキーボードで、半角の\ と同じ 半角の\ と見た目が同じでも、異なる文字コードの文字があるので、 それは使わないようにすべき! プログラムコードの中に全角文字を入れない というだけで十分では? 運用でカバーできる…そんなふうに考えていた時期が俺にもありました おまいらの話がさっぱりわからん もしかしておまいらの画面にはレス中の \ が \ と表示されてるのか? U+005C なのか U+00A5 なのかという問題 以前 Linux の端末で Perl のプログラムで改行として ¥n を入れたらそのまま画面に ¥n が出て来て驚いたことがあったが、 その時はキーボードの「¥」を押すと U+00A5 が入力されており「\」を押すと U+005C が入力されている状態だった。 もちろんキーボードの通りに端末画面に出る。 ま、しかし、これが本来あるべき姿だよな。 お前ら安心しろ、PowerShellのエスケープ文字はバッククォート「`」だ evalは使わない方がいいって聞いたけど 例外処理でeval使わない方がいいんですか? それなら例外処理はどうすればいいんですか? >>72 文字列のevalは使うなという話やろ? でなければ、そう言ったヤツに聞かんと。 セキュリティホールを作ってしまうかも知れないから使うなら気をつけて使えってことだろう。 特に外部から入力した文字列を元にしてevalに渡す文字列を作る場合な。 >>70 Windowsだけが異常なだけなんでは? 俺は本来しか知らないよ >>75 そうなんだろうな。問題は、そこらじゅうにWindowsマシンがあるといこと。 サーバは Linux でも端末が Windows だとおかしい状態で表示されたりする。 (端末用のソフトやその設定次第ではあるが) >>75 遭遇頻度で言えば、Windows以外のほうがレアだけどな! 子飼弾がyoutubeやってるって聞いたんで見てみた 老害オヤジみたいになっててなんだかなあ 2020年にPerl5.32あたりと同じ内容で2021までにはPerl7がリリース予定 目立った機能追加もないからさすがにリリース余裕だろうと思っとんだがあの話しどうなったの? Perlコミュニティ機能してなくてそれすらなくなったとか? 未だにperlでwebサイト作ってるとこあんの? 2chはperlらしいが >>79 亀だが外から見えるまとまった発表はないな。Steering Council もそれに気付いたから近々ブログ記事も出すと言ってる https://markmail.org/message/tqi446jfy42elhz5 まあ Perl 7 の変更点だった strict / warnings / feature 'signatures' のデフォルト有効化と feature qw/indirect multidimentional bareword_filehandles/ のデフォルト無効化は use feature ':5.36' に全部入ったから use v5.36 すれば実質 Perl 7 だ perlファイルに書かれている1行目の記述(#!/usr/local/bin/perl等)を変更せずに、 apacheでperlの参照先を変えたい(出来ればvirtualhost毎)のですが、やり方分かる方ませんか? それOSの力を借りないと無理なのでは?ApacheやPerlの問題ではないと思うが。 自分で /usr/local/bin/perl というスクリプトを作ってしまってそこで切り替えるみたいな誤魔化しで良いなら楽だと思うが。 >>85 OSはUbuntu 20.04.4 LTS を使っています。 何か方法はないでしょうか? shebangを無視してファイルを実行するようなApacheモジュールを組み込んだらできるかも? そんなモジュールはきっと存在しないので、自作が前提だけど。w >>87 shebangを使って出来るか試して見ますね Perlに限った話じゃないんだが、WSL1でubuntu 22.04を使うとWSL1上でgzipバイナリが動かないせいで、tar.gz関連処理が軒並みエラーになってしまう cpanでモジュールをダウンロードするとtar.gzの展開に失敗するのでなにもインストールできない 解決するには、gzipのソースをgnu公式からダウンロードしてビルド&インストールしてWSL1で動くgzipにパスが通るようにする必要がある >>84 試してないが mod_actions 噛ませば良いんでない? AddHandler my-perl-script .pl AddHandler cgi-script .cgi Action my-perl-script /cgi-bin/run-my-perl.cgi とかやって run-my-perl.cgi は #!/bin/sh /path/to/your/perl $PATH_TRANSLATED みたいな >>84 Would you like #!/usr/bin/env perl or /your_favorite_perl_path perl_script きまぐれでどれが呼ばれるか判らんものをよく使おうと思えるな >>94 PATH の通ったディレクトリに Windows 用の xz.exe を置いておくと tar の J オプションで展開してくれるようだが圧縮は対応していない模様。 圧縮は自分でパイプ通してやらないとできないみたい。何故そうなっているかは不明。 あれ?でも gz (gzip) 圧縮なら tar cvfz でできたな。 perlに付属されているh2xsというツールを使ってモジュールを作成したいんですが、ディレクトリに移動に移動してコードを書く方法が分かりませんアドバイスお願いします。 ※Perl https://linuxcommand.net/perl-mod/#i-3 Perlのpackage内my変数についてちょっと疑問。 myはレキシカルな局所変数なので、他package内のmy変数は他のpackageからは参照できず、参照したければmy出なくourにすると解釈していたが。 packageが別々のソースファイルだった場合はその通りですっきりしたスコープ仕様だと思っていたが… ところが二つのpackageが同じソースファイル内にあり、他のpackageのmy変数を参照すると変な感じ: 例 use strict; use warnings; package P1; our $aa = __PACKAGE__.'aa'; my $bb = __PACKAGE__.'bb'; package P2; print __PACKAGE__ . "(1)$P1::aa\n"; print __PACKAGE__ . "(2)$aa\n"; print __PACKAGE__ . "(3)$P1::bb\n"; print __PACKAGE__ . "(4)$bb\n"; 実行結果 $ perl package_a_b.pl Name "P1::bb" used only once: possible typo at package_a_b.pl line 14. P2(1)P1aa P2(2)P1aa Use of uninitialized value $P1::bb in concatenation (.) or string at package_a_b.pl line 14. P2(3) P2(4)P1bb P2からはP1のmy $bbが$bbで参照できて、$P1::bb だとエラー、なんだこりゃ…??? ちな 5.36.0 と 530.0 で確認した。 myはpackageとは何の関係もない packageにmyのシンボルテーブルはない だから(3)ではuninitialized value $P1::bbになる (4)は単なる文字列 正常な振る舞いだよ >>100 回答ありがとう、myがそういうものだと今日まで知らずにいた…おrz myのスコープはブロック、ファイル、evalの3つ パッケージとは無関係だから>>99 ではファイルスコープになるね package P2でもう一度my $bb宣言したらエラーになることからも分かる ローカルサーバーでsrandとrandで生成した乱数の値と レンタルサーバーでsrandとrandで生成した乱数の値が違うのは何で? どちらもsrandの値は同じとする。 プラットフォームのifdefで切り分けてそうだからそれっぽいマクロ定数でも探すといいかも ビルドされた環境のCライブラリ依存じゃない? 同じにしたいならMath::Random::MTとか使えばいいんでね >>104 一般論としてPerlの内部実装は無保証でコロッコロ変わるので、疑似乱数の再現性を担保したいならコードを同梱してしまうのが最も確実 cでたったこれだけ、Perlで詰めれば20行も要らんだろう、局所使用ならファイル内subでいいレベル github.com/bmurray7/mersenne-twister-examples/blob/master/c-mersenne-twister.c 同階層にpl版もある 丁寧にコードされパッケ化で無意味に冗長なので参考ならこっち アルゴリズム特許あるか知らんし、ライセンスを許容するなら同梱 print"A\n",print"B\n"; これの動き教えてくれよ 出来ればサンプルソースも print "A\n", print "B\n"; print("A\n", print("B\n")); まず最初のprintの引数中のprint("B\n")が評価され"B\n"が出力される print("B\n")が成功したので真の値1を帰す print("A\n", 1)となる B A 1と表示される print "X\n", 3 > 0; print "X\n", 3 < 0; print "X\n", open(my $fh, "no_such_file.txt"); 成る程、() 使わない副作用意識しないとダメですね ありがとうございます read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる