Perlについての質問箱 63箱目
■ このスレッドは過去ログ倉庫に格納されています
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。 CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。 (WEBプログラミング板: http://kohada.2ch.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.18.2) ▼前スレ Perlについての質問箱 61箱目 http://toro.2ch.net/test/read.cgi/tech/1381561905/ Perlについての質問箱 62箱目 http://toro.2ch.net/test/read.cgi/tech/1385039352/ 乱立させてたのってPHPユーザーなの? てっきりPerl厨だと思ってたんだけど。 スレ乱立とか頭の悪いことをするのはPerlを選ぶような知能の低いPerl厨くらいしかいないだろ。 php厨()とか妄想をベースに考えるから、事実と整合性が取れなくなって>>17 みたいな書き込みをするようになる というかその不整合からくる違和感に耐えられなくなって書き込んでるって言ったほうが正解か >>17 は自覚がないみたいだけど糖質の疑いがある >>17 糖質も発見が早ければ投薬で治療できるから病院行ってみたら? 自覚があれば病院行くだろうし 糖質と診断されればネットは控えろと言われるだろうから こんなところにはいない 罵倒スレのほうが内容にマッチしてるじゃん、何でわざわざ質問箱で立て直したの? Perl=ちんこ言語 男のちんこをしゃぶれない弱輩には使いこなせない言語 perl 5(v5.16.3)で http://d.hatena.ne.jp/syohex/20110616/1308237655 を走らせると BEGIN not safe after errors--compilation aborted at ~/op.pl line 16. と止まってしまいます。 解決策を教えてください。 >>36 mac持ってないから試せないけど、一応これで動くんじゃないかと。 adhocな対応でセキュリティ考えてないから注意してね。 open my $fh, '<', \(my $dmy = `@cmd`) or die "Can't exec @cmd"; 正規表現で aaa 99 PPP iii 87 XYZ uuu 32 XXX の PPP以降 と XYZ以降 と XXX以降 を取り出すのはどうすれば良いでしょうか? aaa iii uuu が半角の文字 99 87 32 が 数字である事は保証されていますが PPP XYZ XXX に至るまで半角スペース、もしくは全角スペースがいくつあるかは保証されておらず substr 等で切りだす事はできません。わかる方宜しくお願いします。 文章が不透明だから分からなくなる。(誰にも分からない)。 正規表現は完璧に仕様を出さないと書けない。出せば単にそれを書くだけ。 行頭は半角文字列である → ^[a-z] その後に半角スペースがある → \ (←見えないが半角スペース) その後に2桁の数値がある。 → [0-9]{2} その後に一文字以上の半角スペースと全角スペースが不定数混在する → ([\ \ ])+ その後に大文字が3つある → [A-Z]{3} 以降、行末まで。(取り出し対象文字列) → .*$ まぁ辞書やないんやけどな。ここは。 URLに?記号が2つある場合のデータの取得について たとえばhttp:// ○○○.com/pagejump.cgi?http:// △△△.com/disp.cgi?mode=testのよう?が2つある場合 $ENV{'QUERY_STRING'}だとhttp:// △△△.com/disp.cgiまでしか取得できなくて?mode=testの部分が取得できないんですけど フルに取得できるにはどうしたらいいんですか? フル? 「http:// ○○○.com/pagejump.cgi?http:// △△△.com/disp.cgi?mode=test 」の場合、 query文字列は、「http:// △△△.com/disp.cgi?mode=test」 だから、それが取れれば 十分なのでは? その中の一部を取り出したいなら自分で好きに取り出せばいい スマヌ質問内容理解してなかった だがPerl関係なくね? >>43 本当にクライアントが http:// ○○○.com/pagejump.cgi?http:// △△△.com/disp.cgi?mode=test を送ったのなら、それが原因だと思う。 URL の各部分は適切にエスケープされなければならない。 Perl でやるならこうだ。 use URI; use URI::Escape; $u = URI->new("http:// ○○○.com/pagejump.cgi"); $u->query( uri_escape("http:// △△△.com/disp.cgi?mode=test")); # クライアントに適切なエスケープを期待出来ないなら……まあ、がんばってくれ。 >>40-42 これで一致した、次の文字から、行末までを取得する ^([a-z]{3})([\ \ ])+[0-9]{2}([\ \ ])+ 半角・全角スペースは、「aaa○99○PPP」 ○の所にしか入らないのだな? つまり、各トークンの中には、入らないのだな? それなら、全行のすべての全角スペースを、 半角スペースに置換して、その後、 連続した半角スペースを、1つの半角スペースに置換する そして、8文字目から行末までを、取得する >>44-46 URLの各部分では、特別に扱う文字が決まっているから、 クエリ文字列部分で、「? =」・日本語などは使えないので、 エスケープする http://andtokyo.jp &TOKYO sub TOKYO { #だれか面白いルーチン書いて 趣味と勉強を兼ねてcgi使ったホームページを作ってるんだが セッションって格納した値は、同じルーチン内でしか使えないの? 格納したセッションをLocationでとんだ先で取得したいんだけど 何かと組み合わせないとそういうのできないのかな プログラム板でもやっぱそうか・・・・・ バグ発見! 名前欄に0と英数字で入力すると出力されないバグ! 変数の文字の長さで入力を判定して出力させれば バグは治る! すぐに対処を申請します! 質問です。 #!/usr/bin/perl use strict; use warnings; use LWP::UserAgent; use HTTP::Request::Common qw(POST); my $ua = LWP::UserAgent->new; $ua->timeout('7'); my $req = POST('http://yahoo.co.jp' ); my $res = $ua->request($req); print $res->content; のようにすると文字化けします。文字コードの指定方法も分からず困っております だれかおしえてくだあさい もらった文字列と、表示されている文字の、 文字コードが異なっているのだろう 文字を表示しているソフトの、文字コードを変えれば? たぶん環境変数か設定項目にある 文字を表示しているソフトは、何を使っているの? yahoo.co.jpは301 Moved Permanently だけど、move先を指定しても文字化けはない win10の64bit版でperl32bit版動くかな? ちなみにwin7の64bitではperl32動いてます もう1個のスレのほうがメインみたいなのでそっちで聞いてきます ヒアドキュメントで表示は print <<"EOS"; (中略) EOS だけど これをファイルに書き込むにはどうしたらいいんですか? print $fh <<"EOS"; 中身 EOS 別解として perl script.pl > file.txt もしかして、Windowsのスタート→プログラム→アクセサリ→メモ帳 を実行して print <<"EOS"; (中略) EOS を打ちこみ、メモ帳のメニューのファイル→名前を付けて保存 のほうを知りたかったのですか? いきなりだけどPerlのクラスの仕組み(かなり手抜き) + JavaScript の質問用スレッド vol.128 +©2ch.net http://peace.2ch.net/test/read.cgi/hp/1454390682/401- のJavaScriptのthisの話の余談 大雑把に言うとPerlのクラス(オブジェクト)はハッシュに毛が生えたもの ※この段階ではクラスではない。ただのハッシュを返すnew関数とそれを入れたKlassパッケージ package Klass; sub new { return {a=>1, b=>2 } } sub foo {} Perlにはメソッドというものはない。全て関数。 コンストラクタ(一般的にnewという名前にする)もただの関数。 Perlではクラスやオブジェクトはこのようにして呼び出す。 my $obj = Klass->new(); $obj->foo(); ここで問題がある。$obj->foo()は、Klass::foo()を呼び出すことになるが、 $obj(ただのハッシュ)からどうやってKlass::foo()であることを知るのか? ただのハッシュを返しているだけのnew関数にはそれは無理なので ただのハッシュに毛を生やす。 sub new { return bless({a=>1, b=>2 }, 'Klass') } これでただのハッシュじゃなくてKlassという情報がくっついたハッシュになった。 これで$obj->foo()はKlass::foo()を呼び出せる。 ここからが面白くて「アローの左側は関数の第一引数になる」というルールを追加する。 そうすると、Klass->new() という呼び出しは、 new('Klass') 相当になることがわかる。 ということで、newの第一引数にはクラスの文字列が入ってくるのでそれを使える。 sub new { my $class = shift; return bless({a=>1, b=>2 }, $class } さらに、$obj->foo() の呼出も同じ。 foo($obj) 相当になる。 なので、sub foo { my $self = shift; } の$selfにはnewの戻り値である 毛が生えたハッシュ、つまりオブジェクト自身(他の言語のthis相当)が入ってくることになる。 このようにアローの左側が第一引数になる。という挙動は他の言語でも一緒で JavaやC++は内部的にそれを行ってるだけ。 そしてJavaScriptでも.(ドット)の左側が第一引数になると考えると、 JavaScriptのthisがよくわからんという問題も簡単に理解できるはず。 JavaScriptのthisの話は元スレへどうぞ うん。そしてそれが有用ならもっと使われているはずだが、現実はあまり使われていない。 コードが実行時に生成されるようなダイナミックなものはデバッグ、テスト、保守がしにくい。 文字列の/*と*/で囲まれた部分と/*と*/に色をつけたい 例えば$str="/*abcdef*/";の場合は $str =~ s/\/\*/<font color=\"green\">\/\*/g; $str =~ s/\*\//\*\/<\/font>/g;でできましたが $str="/*//////abcdef/////*/";の場合はうまくできませんでした。 どうすればうまくいくのでしょうか? $str = ̄ s{(/¥*.*?¥*/)}{<font color=”green”>$1</font>}g; my $data = { 'data1' => [1,2,3], 'data2' => [4,5,6], 'data3' => [7,8,9] }; 上のような配列のハッシュで ハッシュそれぞれの0番目、1番目、2番目のデータを 取り出したい場合どうすればいいのでしょうか for (my $i = 0; $i < 3; $i++) { print $data->{"data1"}[$i],"\n"; print $data->{"data2"}[$i],"\n"; print $data->{"data3"}[$i],"\n"; } ごめん、ちゃんと書いたのに何かアクシデントがあったようだ。もう一回送るよ。 それで合ってるよ。 http://perldoc.jp/pod/perldsc を読みなさい。 $data->{"data1"}->[$i] が正式な書き方だが (配列|ハッシュ)要素の参照が連続していれば間の矢印を省略してもいい。 個人的には、リファレンスだということを意識していたいから省略しないけどね。 シングルクォートもダブルクォートも要らねぇ。 my $data = { data1 => [1,2,3], data2 => [4,5,6], data3 => [7,8,9] }; print $data->{data1}[$i],"\n"; >>75-77 勉強になりました。 ありがとうございます。 Web::Scraperでスクレイピングしているのですが サンプルでは use YAML; warn Dump $res; という書き方でこの方法だとデータの構造がよくわからないのですが Dump何をつかっているのですか? Ubuntu14.04の64bitを使っています。 >>79 データの構造はData::Dumperをイントールしたらわかるようになりました。 すみません。 print $res->{list}[1]->{link}[0]->{url},"\n"; print $res->{list}[1]->{link}[0]->{title},"\n"; print $res->{list}[1]->{link}[1]->{url},"\n"; print $res->{list}[1]->{link}[1]->{title},"\n"; こういったデータをforeahで出力したい場合 ???にはどのようにかけばいいのでしょうか foreah my $i(???) { print $i->{url}; print $i->{title}; } >>81 my $links = $res->{list}[1]{link}; for my $link ( @$links ) { say $link->{$_} for qw/url title/; } >>83 say forの行が気持ち悪い。やり直し >>84 やり直し(キリッ じゃなくて自分ならこうするというのを示せよw >>83 ありがとうございました。 一度変数に保存してからすればよかったのですね。 my $links = $res->{list}[1]{link}; for my $link ( $res->{list}[1]{link} ) { こういう書き方をしていてリストにするにはどうしたらいいのか わからないので質問させていただきました。 たいへん勉強になりましたありがとうございました。 >>86 デリファレンスは一度代入しなくてもできるけどちょっとわかりにくいかなって for my $link ( @{ $res->{list}[1]{link} } ) { 新しい書き方だとこんなのもあったり(postfix dereferencing) $res->{list}[1]{link}->@* 1位は「Python」、プログラミング言語別の平均年収ランキングが発表 http://www.mdn.co.jp/di/newstopics/44248/ 2位には「Perl」(平均年収633万円)、3位には「Ruby」(平均年収606万円)がランクインした。 >>67-68 超亀レスですがありがとうございます、勉強になりました! my $date = '平成28年2月26日18:55'; my $week = '金'; $date =~ s/日/日 $week曜日 /; print $date; をすると文字化けするのですが原因がわかりません。 さくらのレンタルサーバーのCGIでPerl 5.14.4です。 $weekを削除すると文字化けはおこりません。 別のプログラムではうまく動いているのですが $week\xe6\x9b\x9c\xe6\x97\xa5になっているみたい プログラム内に入力している日本語がprint表示するときにくずれるようです。 ${week曜日} ${week}曜日 >プログラム内に入力している日本語がprint表示するときにくずれる やっぱutf8フラグかなあ… 日付で教えて下さい 1/23 12:34 を西暦をくっつけて 2016/1/23 12:34に変換したいのですが 例えば未来の日時の場合は 5/1 12:34 を2015/5/1 12:34と1年引いた年にしたいのですが 下のプログラムでは 2015/05/02 06:45:10になります 年の引き算はどうすればいいのでしょうか use strict; use warnings; use 5.010; use Time::Piece; use Time::Seconds; my $t = localtime; my $year = $t->year; my $str = "1/23 12:34"; my $date = Time::Piece->strptime("$year/$str", '%Y/%m/%d %H:%M'); if ($t < $date) { $date -= ONE_YEAR; } say $t->strftime('%Y-%m-%d %H:%M:%S'); say $date->strftime('%Y-%m-%d %H:%M:%S'); >>96 いや、年の引き算って言っても一年は365日とは 限らないんだから、仕様を決めないとだめでしょ? 例えば2月29日の1年前は何日なのか?っていう。 だからそうすると2月29日が出来てしまうって言ってるわけ pythonのスクリプトの頭に、use strict;って書いた。頭いかれてきたw my($year,$month,$day,$hour,$min) = (localtime)[5,4,3,2,1]; my $str = "1/23 12:34"; my($strmonth,$strday,$strhour,$strmin) = $str =~ m|([0-9]+)/([0-9]+) ([0-9]+):([0-9]+)|; if ( sprintf('%02d%02d%02d%02d',$strmonth,$strday,$strhour,$strmin) gt sprintf('%02d%02d%02d%02d',$month+1,$day,$hour,$min) ) { printf("%04d/%02d/%02d %02d:%02d\n",1900+$year-1,$strmonth,$strday,$strhour,$strmin); } else { printf("%04d/%02d/%02d %02d:%02d\n",1900+$year,$strmonth,$strday,$strhour,$strmin); } # 基本に忠実に。応用はそれから >>102 $month -= 2; my $str = "2/29 12:34"; したら、2015/02/29って答が出るコードなんぞ貼るなや 元の質問者のコードに、 ふつうに$obj->is_leap_yearの判定加えて、 2/29跨ぎなら、LEAP_YEAR 引けばいいだけだろ。 要件にない仕様を自己満足で追加してはいけない この件はTime::Pieceだとうまくこなせない問題 融通がきかないのがオレオブジェクトのつらいところだ localtimeとTimelocalは次スレのテンプレに追加するか 同じ質問が繰り返されてみんな同じところではまるからなあ クッキーへの書き込み処理での質問 エラーメッセージを取得処理 print "Content-type:text/html\n"; if(エラー数が0の場合){ 投稿データをクッキーに書き込む処理 } print "\n"; エラーメッセージの表示処理 というようにエラーメッセージの取得と表示の間に print "Content-type:text/html\n";print "\n";を挟む形になってしまうので これらをまとめてサブルーチン化したくてもできません こういう場合でもうまくサブルーチン化できる方法を教えてください エラーメッセージの出力時にContent-typeから出力すればいいのでは >>109 そのためにCGI.pmなどのライブラリや 各種フレームワークがある。 何をしたかったのかよくわからないけど、せめて cookie と書いてほしかった。 住所を入れる変数でさ $adoresu = ・・・ みたいな名前つかうヤツ、いるよね 英語なのか何なのか、よくワカラン $message = エラーメッセージを取得; print "Content-type:text/html\n"; if(エラー数が0の場合){ 投稿データをクッキーに書き込む処理 } print "\n"; print $message; # エラーメッセージの表示処理 my $str = "あああabcあああcdefghあああ123456"; この文字列で半角英数字の部分をAAAに置換するにはどうすればいいですか? あああAAAあああAAAあああAAAになればOKです ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.0 2024/04/24 Walang Kapalit ★ | Donguri System Team 5ちゃんねる