Perlについての質問箱 64箱目
■ このスレッドは過去ログ倉庫に格納されています
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/
Common Gateway Interface https://ja.wikipedia.org/wiki/Common_Gateway_Interface Common Gateway Interface(コモン・ゲートウェイ・インタフェース、CGI)は、 ウェブサーバ上でユーザプログラムを動作させるための仕組み。 現存する多くのウェブサーバプログラムはCGIの機能を利用することができる。 CGI は環境変数や標準入出力の扱えるプログラミング言語で扱うことができる。 (洋書) Mastering Perl: Creating Professional Programs with Perl 2nd Edition [2014/1/27] https://www.amazon.co.jp/dp/144939311X/ マスタリングPerlの第2版 (洋書) Programming Perl: Unmatched power for text processing and scripting 4th Edition [2012/3/9] https://www.amazon.co.jp/dp/0596004923/ プログラミングPerlの第4版 >>7 perl で書けばperl そのものじゃん。 しかし、perl は終わったな。 python に取って代わられた。 単にCGIで使われるという流行が沈静化しただけだよ。使われている所では使われている。 元からCGI専用言語でもなんでもなくなんでもできるからな。 Python は機械学習で現在流行っているが、それもやがては沈静化するだろう。 かといってなくなることはない。 けっこう大きめのEUCで出来たプログラムを全部utf8に直す作業が始まるんだが、面倒くさいんだが 構成ファイルもたくさんあるし、読み書きしてるようなファイルもたくさんあるし、プラグイン方式みたいに作られてて、既存のプラグイン的なのも全部EUCでutf8に直さなきゃならないんだが めんどくさいと言うか、正常に動くのかどうか不安なんだが 一応表面上は正常に動いたように見えても、俺にはそれはまやかしに感じるんだが はいやっぱりバグったファイルの読み込みが出来なくなった そういやUTF8だとprintfとかで幅を揃えるのができなくなったりして大変だな。 %-10sとかやっても漢字が入るとそこが出力時に3バイトになったりしてずれて役に立たない。 こういう幅とか考慮してフォーマットしてくれるモジュールあるんだろうか?perlだから誰かが作ってそうではあるが。 Unicode::GCStringでカラム数とれるっぽいから空白いくつ詰めるかは計算できそう かなり頑張ったがUTF8にするのは無理だということになって諦めた sjisとEUCとutf8が無駄に入り乱れる結果になった ファイル名はプログラム内部ではEUCで扱ってたり、実際のファイル名はsjisだったり、ファイルの中身はEUCだったり、通信はsjisだったり、 そもそも文字単位じゃなくてバイト単位でデータを管理する記述がめっちゃあったり、 ゴミかよ! $str = "abcdefg"; open( $fh,"<",\$str); open( $fh2,"<&",$fh); はできるけど open( \*STDIN,"<",\$str) open( \*STDIN,"<&",$fh) はできないんだな。知らなかった。"Bad file descriptor" って言われた。 どこかに書いてあったっけ? ちょっとマジで聞きたいことがあるんだが、cgiからブラウザに対してCP932でHTMLが出力されている。 もちろんヘッダも正しく指定されている。 んで、そのHTMLの中に、 <IMG SRC="あいうえお.jpg"> などと言う日本語のファイルが指定されているわけだ。 その日本語のファイル名も、CP932だ。 んで、ご丁寧にブラウザが自動でURLエンコードしてくれるようなのだが、 %E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A.jpg となるのだ。これは "あいうえお.jpg" をUTF-8として解釈した時の文字コードだ。 俺としては %82%A0%82%A2%82%A4%82%A6%82%A8,jpg (CP932の文字コード)となってもらわなくては困る。 聞きたいことは2つで、これを解決するにはどうしたら良いか? もう一つは、ブラウザごとの仕様によりこの挙動は違うのか? の二点だ よろしく頼む >>20 自分でファイル名をそういう風にエンコードすれば? >>21 すまんが読めなくなるから駄目 あと、断定はしてないが、ブラウザやHTTPDのソフトごとに、エンコードやデコードの扱いの違いがある疑いがある 開発環境のwindowsでANHTTPDってやつ使ってるが、こいつはたぶんファイル名をデコードしてないくさい でも運用環境(有料で借りてる)のApacheさんはパスをURLデコードしてる模様 俺の予想だと、ブラウザも古いのだと絶対自動でUTF-8なんかにはデコードしないと思う。 もしかしたら間違ってるかもしれないけど 困る 統一して欲しい >>23 ほぼない けどWeb制作板に行くとエンコードどころか文字コードも理解してなかったから絶対回答こない どうしてもすぐになんとかしたいなら全てをUTF8にする。 ほんとにcp932なのか? 実はUTF-8で出力されてて、ヘッダはただ無視されてたりしないのか? まず、クライアントでデータを保存して、バイナリエディタで確認してみたら? そのような不正な URL がどのように扱われるかを問うのはあまり有意義とは思えない。 適切に扱ってほしいなら適切にエンコードするしかないと思うのだが。 HTML::Element とか URI を使えば簡単だよ。 >>26 ほんとにcp932 なのにutf8でエンコードされる >>27 cgiは、どっかにあるHTMLが書いてあるテキストファイルを読み込んで出力してるだけだから、<IMG SRC="あいうえお.jpg">のあいうえおの部分を見つけ出してエンコードするのは無理がある。 さらにエンコード下として、それをデコードしてパスを通すhttpdと通さないhttpdがあるようなので仕様を知りたい ホントにそうなら、やっぱブラウザのせいなんかね。 データをデコードしたテキストをそのままURLにしたら、たしかにそうなりそうな気はする。 どうしてもあちこちいじらずに簡単に対処するなら、サーバーのほうはどう? プロキシとかRewriteとか使って、とにかくURLを受けてしまってから、受けたURLを動的に解釈したら? >>29 もうcp932のファイル名はやめて全部アルファベットにしようと思うのだが、 Rewriteってなんだろう アニメが出てきたんだが まあおまえらありがとうな utf8ならまだしもcp932のファイル名をそのまま使おうとした俺が悪かったんだよきっと でもwindowsがcp932のファイル名だからしょうがないんだよ >>20 ブラウザがUTF-8 と解釈するのは、HTML のheader に、言語の指定をしていないからじゃないの? ただし、sjis を指定しても、そのPC がsjis に対応していないかも? >>22 >運用環境(有料で借りてる)のApacheさんはパスを、URLデコードしてる模様 URLデコードするかどうかを、設定ファイルで指定できないの? >>30 web 系は、すべてのファイルを、BOM 無しUTF-8(UTF-8N)に統一すべき! 他の言語を使うと、PC・スマホがその言語に対応していない場合に、バグる 漏れは、web 系の本を、軽く数十冊は読んでるけど、 sjis のファイルを使う本は、見たことがない それに、パス・ファイル名などのシステムの構成物に、全角を使う本も見たことがない。 パス・ファイル名は、ファイル内容のテキストじゃない。 あくまでもシステムの構成物だから、半角英数字が基本 Linux・Windows 共用のパス・ファイル名には、半角英数字と、_ (アンダーバー)だけを使う。 半角空白もバグるので、すごく嫌われる さらに、大文字小文字だけが異なる、パス・ファイル名も使ってはいけない。 例えば、Ab, aB がLinuxでは使えるけど、Windowsでは共存できないから だから、このシステムは、sjis・全角の2つを使う、違反を起こしている! こういうやり方を書いた本は、絶対に無いはず sjis を使っているのは、ロートルの5ch ぐらいw だから少しでも、5chのシステムをいじるとバグるから、システムを修正できない! >>30 「RewriteRule」。 # 「httpd」とかいうから、Apacheに詳しいんかと思ってた。 要はとにかく、サーバーがURLを受けてから、それをランタイムで変換して実際のアクセス先を決めることはできるはず、という提案。 >>31 URLデコードを禁止できるか? URLの仕様なのに。 それに、もししたとしたら、CGIの引数とかどうなるんだ? >言語の指定をしていないからじゃないの? してる >$print_code .= q[Content-Type: text/html;charset=Shift_JIS] . qq[\n]; >$print_code .= q[<META http-equiv="content-type" charset="Shift_JIS">]; >URLデコードするかどうかを、設定ファイルで指定できないの? 金払って借りてるマシンなのでたぶん無理なんじゃね? いやApacheさんの使い方とか仕様とか全然知らないから知らんけど >UTF-8(UTF-8N)に統一すべき! cgiが古いんだよ 作り直したいけど簡単そうじゃないので放置してる 気持ち的には全部utf8にしたい >>34 俺のサーバーじゃないけどそんなこと出来るのか? >>36 >$print_code .= q[Content-Type: text/html;charset=Shift_JIS] . qq[\n]; >$print_code .= q[<META http-equiv="content-type" charset="Shift_JIS">]; 「html sjis meta」で検索すると、以下が見つかる。 上とは、ちょっと違う <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 他には、PHP で作ったそのファイルが、UTF-8 で保存されているとか? 「html sjis 文字化け」で検索すれば? 文字化けを防ぐ&解消する方法 https://www.be-webdesigner.com/tips/coding/mojibake.htm >>36 レンサバでも、管理者だったらいろいろできる。 しかし、もしそうだったとしても、どうやらたぶんおまえにはムリぽなので、もうあきらめろん。 >>20-21 ブラウザごとにURLエンコードは統一は取れてなかったと思うよ まず開発環境としてANHTTPDの使用をやめることをお勧めする IISかApacheをインストールして使った方がいいと思う https://lavender.5ch.net/test/read.cgi/airline/1551189110/ このツールが使えない 誰か使い方を教えてくれ ソースを拡張子.plにして保存、perl実行環境はインストール ここまでは出来てる ソースの改造の仕方が分からない 今の5chではスクリプトによる連投はできないのでは? 試したことないのでわからんが。 しかしそのツールなんでわざわざforkして子プロセスに同じことさせてんだろ?その辺がワザなのか?よくわからんね。 Perl は初めてかい? まず、Perl の勉強からだね。 何をするプログラムかは後回しにして、何が書かれているかを理解できるようになろう。 書かれていることを理解できるようになったら、使われているモジュールを理解しよう。 LWP を使ってみよう。勉強しなければならないことがたくさんあると気付くだろう。 最低でも HTTP の仕様書くらいは読まないと話にならない。 ここまでできれば最初のソースコードを理解して改造だってできるかも。 彼はインストール方法を知りにきただけであってPerlを知りにきたわけではないだろう メッセージ固定だなんて連投というより荒しツールだな だよなあ。そのせいでお気に入りの専ブラ使えなくなったし。 もうC++/Qtで書く気がしない。 Perl/Qtで事足りる。 Perlの開発者が「PCの速度が上ればCである必要はないだろう」みたいな事言ってたけど、 まさにその通りだな。 >>48 その perl は perl6 ですか? なんかのはずみで処理が終わらなかったとき、自殺するようにしたいんだけど、 eval { alarm 5; $SIG{ALRM} = sub { exit; }; }; これでいいんだっけ? いいんじゃないすか それだけだとevalはいらないと思うけど あと慣例ならハンドラ設定が先かな exitじゃなくdieとか ありがとう >evalはいらないと思うけど よく覚えてないけど、evalはシグナルに対応してないシステムだとエラーで落ちる気がした Perl News に "Fork yeah!" というのがあってちょっと驚いた。 https://www.perl.com/article/fork-yeah-/ メアド用にさくらインターネットのライトプラン(sslログインなし)借りてるんだけど そこにちょっとしたcgi作って置こうとしてて ものすごい久々にuse CGIとかやってます。 で、corelist CGIってやると > Data for 2018-01-20 > CGI was first released with perl 5.004, deprecated (will be CPAN-only) in v5.19.7 and removed from v5.21.0 と出るんだけど CGIが標準モジュールから削除された理由とか、 代替となるモジュールって知ってる人いませんか。 Perlはweb用の言語じゃないから標準モジュールからは消した とか そんな理由ならいいんだけどさ。。 「core は出来るだけ小さく」 「CGI はもはや Web の主流ではない」 かな。必要になった者のみが追加でインストールすればよい 標準で代替になるようなものはないと思うが pure perl だろうし最悪 CGI モジュールも一緒にアップロードとかでも動くでしょ そもそもさくらレンタルサーバーで使える perl って 5.8 〜 5.14 ぽいけど ttps://help.sakura.ad.jp/hc/ja/articles/206053142#ac05 >>56 どもども その理由なら安心ですわ perlのバージョンは確認したんだけど、消えた理由によっちゃ使うの気持ち悪いなーと思ったので どもでした。 5.30が出るのかと思ってたら、出てねー やる気ねーのかよ ていうかこんなに長くアップデートが続いていることだけでもかなり凄い事だと思う。 5.30.0 RC2までは出てるからそのうち出るだろ $str =~ /$pattern/ みたいなことはできるけど、 $str =~ /$pattern/$opt みたいにして大文字小文字を同一視するかどうかを動的に指定したい if文で処理行を分けるしか無理? Ruby では、Regexp オブジェクトで、動的に作れる str = "aB" opt = Regexp::IGNORECASE p re = Regexp.new( str, opt ) #=> /aB/i パターンマッチの直前で比較対象の文字列を uc() 使って小文字を全て大文字に変換しておく、または lc() で大文字を全て小文字にしておく事でも実現できるな。 パターンの方にも変換必要になるかも知れないが、それについては予め大文字または小文字でパターン作っておけば回避できる。 ただ、どう考えても遅くなるよな 素直に切り替えよう >>61 # http://perldoc.jp/docs/perl/perlre.pod#Extended32Patterns my $subject = 'FooBar'; my $search = 'foobar'; my $pattern = qr/$search/; print $subject =~ /$pattern/ ? 'match' : 'unmatch', "\n"; $pattern = qr/(?i)$search/; print $subject =~ /$pattern/ ? 'match' : 'unmatch', "\n"; (?i)と書いておけばいいだけか じゃあもう実装済みで、使う側でどうにでもできる Pythonはほどほどの長さのスクリプト言語としてならアリなんだが ツールとしては良くも悪くも電卓だなぁ バッチは使いやすさでperl、サーバだと今はパフォーマンスで選んでgolangやろうとしてるわ >>71 読んだけど、実際にはタイトルほどPythonを悪くいってないな。w windowsでreaddirするとcp932で読めてくる それだと面倒なので、opendirする時か、ハンドラに対して、 decoding(cp932) みたいに指定するにはどうすればいい? perltidy -pbp -nola perl_file この -pbp は perl best practices にする設定になっている という仕様が書かれているが sub { :LABEL for .................... のようなラベルが本の通りにならない。たとえば 103ページなど ラベル調整を諦めて -nola をつけ、手動で正しくすることにした これバグだよな? https://i.imgur.com/YlNx4as.png 左のように綺麗にまっすぐ整えろ が本の通りなのに 右のように変なところにいく sjisでローマ数字のUが書いてあるのをutf8にすると、どうやっても化けるな 一旦生で読んでcp932でデコードすればいいのか LWP:Simpleだとそのへんに手が出せない MySQLもそうだけど、sjisは使っちゃイカンやろ。 細かいところで文字の置き換えルールがメチャクチャだったような。 いわゆるシフトJISはとにかくcp932で。 多分htmlに俺はsjisだと書いてあると、LWPが勝手にsjisでデコードするんだろう 元がeuc-jpだと、 $str =~ s/\x{301c}/〜/g; みたいなことを明示的に書かないと、回避できないみたい 同じものやがな 下記のコードですがダブルクォートを介さずに$testから'フ'を表示させる方法はありますか? #!/bin/env perl use strict; use warnings; use utf8; my $test = '\xE3\x83\x95'; my $test2 = "\xE3\x83\x95"; print "$test\n\n"; print "$test2\n\n"; my $test3 = $test; $test3 =~ s/\\x([0-9A-Fa-f]{2})/pack('H2', $1)/eg; print "$test3\n"; print eval qq/"$test\n\n"/; こんな書きかたあったか? DB<27> printf "%s\n", ('Fizz')[$_%3] . ('Buzz')[$_%5] || $_ for (1..15) 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz ()[]が見おぼえがない ()で配列とみなしたとき ()[0]は定義されていると考えて ()[1]などは未定義で無しというトリックか DB<25> print "$_ cup", ("s")[$_ < 2] , " of coffee\n" for (1..3) 1 cup of coffee 2 cups of coffee 3 cups of coffee DB<23> printf "%s\n", "$_ cup" . ("s")x!!($_ != 1) . " of coffee" for (0..3) 0 cups of coffee 1 cup of coffee 2 cups of coffee 3 cups of coffee DB<24> printf "%s\n", "$_ butterfl" . ("y","ies")[($_ != 1)] for (0..3) 0 butterflies 1 butterfly 2 butterflies 3 butterflies 今はもう (1)[1] が空リストにならないんだな。perl5220delta に書いてあった。 リストコンテキストでの問題を避けるために [split( /::/ , $class)]->[4] みたいな書き方をしていたんだが。 いや、これは変えなくていいのか。 undefは省力とかフェールセーフ的に有効にするんじゃなくて、 厳密に仕様化して積極的に使うべきだよな 初期化されてないものを使うのが気持ち悪いと感じるのは、 auto変数が本当に領域確保するだけだった頃の名残り 簡単なシェルスクリプトしか書けない素人ですがPerlの利点ってどこです? grep -Pやperl -peで世話にはなっていますが目当てはあくまで正規表現だけですし 比較演算子はbashと逆だし変数は記号で使い分けなきゃならんしなんだこいつってなって テキスト処理に特化されているところ そのおかげで "," や " " とかの部分を q(,) q( ) などと書けたり perl コードが正規表現と一体化していて再帰も扱えたりなど色々あるが 全部特化したことによる利点 bashで凝ったことを書くことを考えたら、Perlのほうがはるかに簡単。 bashは所詮シェルなので、クォートとかエスケープとか変数とか関数とか、いちいちワナが多いからな。 Perlの利点? 他の言語と同様になんでもできることかな。モジュール色々使うと作るの楽だしOSの違いもかなり吸収されてWindowsでもLinuxでも何も変更せずに動くプログラムも作れる。 シェルスクリプトも外部コマンド動かせば何でもできるとは言えるが、起動のオーバーヘッドの問題や起動しているコマンドの仕様が変わったときに個別に対応しなければいけないなど面倒な事がある。 >>101 > OSの違いもかなり吸収されてWindowsでもLinuxでも何も変更せずに動くプログラムも作れる。 これでとんでもない目に遭ったぞ。 perlの\nは、内部的にはLF のみだが、OSがWindowsなら、出力する際に CR+LF に自動的に変換してくれる。 しかし、出力文字コードがutf16le だと、特殊な宣言文を書かない限り、 LF (0x000a)は 「0x000a000d」ではなく、「0x000a0d」に変換され、 ぐちゃぐちゃに文字化けする。 文字化けの原因を特定し、回避方法を見つけるために、ずいぶん時間を取られた。 >>102 \n は他の言語でも気を付けた方が良い。 例えC言語だったとしても歴史的な事情でライブラリが勝手に変換するかも知れない。 この頃はそれにまつわるバグは減ってるとは思うけどね。 ま、少なくとも \n を \x0a だと信じ込んで使うのは止めた方がいいだろうな。 \x0a はあくまでも \x0a と書いた方が良い。 Javaとかでは改行は System.out.println() を使って改行させるようにして \n を埋め込んでの改行は極力避けた方が良い。 >>102 いや、特殊な宣言文ってなんだよ。PerlIO の man 読めよ。 open 関数や binmode 関数の説明にも「PerlIO を読め」って書いてあるよ。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる