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/ # [Perl 日本語処理の基礎の基礎] # このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。 # 入出力ともシフト JIS 形式のファイルまたは DOS 窓を想定しています。 use utf8; use open IO => ":encoding(cp932)"; binmode STDIN => ":encoding(cp932)"; binmode STDOUT => ":encoding(cp932)"; binmode STDERR => ":encoding(cp932)"; use Encode; # 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう # おまじないです。 ■推移 ttp://www.tiobe.com/index.php/content/paperinfo/tpci/index.html 2013.Dec 1.072% 2014.Jan 0.917% 2014.Feb 0.887% ■推移グラフ ttp://www.tiobe.com/index.php/content/paperinfo/tpci/Perl.html ■Perlの今後 他言語に対する優位性がほとんどないため、消滅に向かって進んでいる。 近い将来消えるのは確実。 TIOBEって日本じゃほとんど聞いたことがないよね?Perlは日本語をちゃんと処理 できる数少ない処理系だから、海外とは状況が違うと思うんだよね 自分がほとんど聞いたことがないという無知っぷりを晒しつつ その前提で語る基地害がPerl厨 乱立してる統計サイトの内の一つで、たいしたサイトじゃない。 http://langpop.com/ こんなサイトもあって、今話題に登ってる言語の項目とか見たら PHPもPerlも似たりよったり。 こんなもんに一喜一憂するのはアホのする事。 #別に「Perlが落ち目じゃない」と主張するつもりも、毛頭無い。 WebProgの方で、その活動すれば? そのスレの内三つは荒しが立てたスレだし、Perlと名前が入るスレ自体も10個しかないけど 向うには両手に余るくらいのスレは乱立してるぞ。 久々の正式なスレ立て乙 個人的には「ミニマルPerl」が俺の目を覚ましてくれた本だなあ まあ、解ってる人には間違いなく退屈な本だけれども スレ乱立のうちの1つだから全く乙じゃない ただの迷惑行為 重複によりこのスレには削除依頼が出されました ↓のスレに移動してください 【誘導】 Perlについての質問箱 63箱目 http://toro.2ch.net/test/read.cgi/tech/1392906213/ 【プログラミング自体の経験が無い奴はまずココを読め]】 Perl プログラミング講座: ttp://nyx.pu1.net/ 【本】 リャマ: ttp://www.oreilly.co.jp/books/4873112575/ 駱駝: ttp://www.oreilly.co.jp/books/4873112869/ Effective Perl: ttp://www.c-r.com/book/detail/888 クックブック: ttp://gihyo.jp/book/2012/978-4-7741-4972-1 Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/9784873113425/ Perl Hacks: ttp://www.oreilly.co.jp/books/4873112915/ 【オンラインマニュアル】 最新のドキュメント: ttp://blog.livedoor.jp/kumagai_nori/archives/52255109.html perldoc.jp: ttp://bg.pi-ppi.com/ perldoc.perl.org: ttp://manual.xwd.jp/ 例のPHP厨毒の精神異常者がスレを乱立させてから動きがパッタリやんだが、規制食らったのか? それとも夜に活動が再開されるのか? 乱立させてたのって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日が出来てしまうって言ってるわけ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.4.6 2024/03/23 Walang Kapalit ★ | Donguri System Team 5ちゃんねる