1 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 16:47:06 ] "The duct tape of the Internet" こと、Perl についての質問箱です。 "There's more than one way to do it" ということで、 Perl の奥深さについて皆で語り合い、追求してまいりましょう。 CGI についての質問は板違いです。WEB プログラミング板でどうぞ。 CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。 (WEB プログラミング板: pc11.2ch.net/php/ ) CGI の質問は答えが Perl と全然関係ない話に帰着する場合が 多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。 このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。 スレ違いの質問にはスルーか、速やかな誘導をお願いします。 www.perl.org/get.html ● 2010/02/19 現在の最新版: 5.10.1 ▼ 前スレ Perlについての質問箱 42箱目 pc12.2ch.net/test/read.cgi/tech/1257139591/ リンク集は >>2-3 Perl 日本語処理の基礎の基礎 >>4 過去スレは >>5-7 あたり
77 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 17:54:42 ] 続けてですみません。 私が作りたいと思っているプログラムが 「携帯Aから(絵文字などを含む)メールを受け取り、携帯Bに転送する」 というものなのですが、>>72 で書いたコードではデコメは良いのですが 絵文字が全て〓に化けてしまいました。 サーバーで受け取った時点で〓に置換されてしまうので、送る各キャリ アに合わせて文字コードを変換しなくてはならないとわかりました。 ttp://cgipon.specters.net/labo/it_emoji.htmlで紹介されているサン プルを試してみたりしているのですが、上手く変換してやることができ ずにいます。 どのような方法を試してみればよいでしょうか?
78 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 19:35:50 ] 〓に変換されたらもとが何の絵文字だったか知りようがないのでは?
79 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 21:27:10 ] SoftBankの絵文字に変換されてるって意味じゃないよな
80 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:59:19 ] >>77 > どのような方法を試してみればよいでしょうか? どこが悪いのか突き止めて、そこを修正するといいよ。
81 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 07:40:31 ] バッチファイルに以下のように記述し、放り込んだファイルの名前に応じて テキストファイルの一部を置換したいんですが、よく文字化けしてしまいます >>4 を使ったplファイルを別途用意せず、バッチファイルへの記述だけで 文字化けに対応する方法はないでしょうか? perl -pe s/"置換前文字列"/"置換後文字列"/ "置換前.txt" > "置換後.txt"
82 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 09:30:44 ] >>77 です。 >>78 全てを試したのではないのですが〓に変換されたのは、ほぼ全ての絵文字 でした。 >>79 SoftBankではないです、言われてみれば〓はSoftBankのロゴなんですね。 >>80 上記のサイトのサンプルの関数を通して変化しなかったので、他のサイト を一生懸命探していました。 絵文字はこんなに難しかったのですね
83 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 11:35:37 ] >>81 perl -Mencoding=xxx かな。 PERLIOとかPERL_ENCODINGは効かないのか...
84 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 03:58:23 ] >>83 ありがとうございます が、恥ずかしながらうまく使えません・・・ 以下みたいなのとは根本的に使い方が違うんでしょうか? perl -Mencoding=sjis -pe s/"置換前文字列"/"置換後文字列"/ "置換前.txt" > "置換後.txt"
85 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:34:22 ] 実はsjisじゃなくてcp932ってオチだったりして
86 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:34:27 ] Encode::JP::Mobile; を使った経験のある方がいたら、教えてく下さい。 my $subject_encoded = is_imode($email_to) ? '=?SHIFT-JIS?B?' . MIME::Base64::encode_base64( encode( 'x-sjis-docomo', $subject ), '' ) . '?=' : is_softbank($email_to) ? '=?UTF-8?B?' . MIME::Base64::encode_base64( encode( 'x-utf8-softbank', $subject ), '' ) . '?=' : is_ezweb($email_to) ? encode( 'x-sjis-kddi-auto', $subject ) : '=?ISO-2022-JP?B?' . MIME::Base64::encode_base64( encode( 'iso-2022-jp', $subject ), '' ) . '?='; UTF-8文字列の$subjectを上記を使ってエンコードしたいのですが、文字 化けしてしまいます。Encode::Guessで確認するとasciiに変換されていま した。使い方に間違いがあるでしょうか?よろしくお願いします。
87 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 09:11:14 ] >>86 どの携帯キャリアの分岐だったのか、encode_base64を通す前が問題なのか 通した後が問題なのか、ぐらいは切り分けてから質問しろよ。
88 名前:デフォルトの名無しさん [2010/03/16(火) 14:21:01 ] プログラムを組む際は use strict を最初に書いておく事といわれたので、 これをつけて.plファイルを実行すると、 下記のようなエラーが多く出ます。どう対応すればいいでしょうか_? use strict をつけないと特にエラーは出ません。 Global symbol "$xxxx" requires explicit package name at xxxx.cgi line 16.
89 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 14:55:14 ] >>88 「use strict を付けた状態でエラーにならないように書け」ってこと。 変数にmy付けてスコープを明確にせよ
90 名前:デフォルトの名無しさん [2010/03/16(火) 15:10:35 ] >>89 thanks
91 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 18:26:58 ] >>87 不十分でした、すみません。 キャリアはdocomoなのでis_imodeの分岐を通っています。 encode_base64の前と後、どちらに問題があるのかつかめていない状 態です。 utf-8にデコードした文字列をそこに通すだけで良いのかと考えてしま っていたのですが、使い方を間違っているようです。 絵文字について調べてEncode::JP::Mobileを見つける事ができたので すが、携帯から受け取ったメールをそのまま返信するというコードに、 どう当てはめていけばよいのかわからずに苦戦中です。
92 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 20:46:44 ] 使い方はそんなもんのような気がするので、入力段階で化けてそうだが。 単に化けたというんじゃなくて、具体的に$subjectがこれこれのときに 結果がこうなって化けてますというのを示して欲しい。
93 名前:デフォルトの名無しさん [2010/03/16(火) 21:20:56 ] DBIx::Classについて質問です。 PostgresqlのXML型へ代入しようとするとエラーが出ます。 DBIx::Class::ResultSet::update_or_create(): DBI Exception: DBD::Pg::st execute failed: ERROR: operator does not exist: xml = unknown LINE 1: ...fo_id = $1 AND me.program_type_id = $2 AND me.res = $3 AND m... ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. XML型への代入にキャストが必要だということはわかったのですが、 具体的にどうすればよいのか、ググってもマニュアル読んでも見つかりません。 賢い方、どうかご教示ください。
94 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 09:17:32 ] >>92 レスありがとうございます。 ttp://yanor.net/wiki/?%E6%90%BA%E5%B8%AF こちらのメール送信を参考にさせてもらっています。 my $email_to = '00000000000@docomo.ne.jp'; MIME::WordDecoder->default( MIME::WordDecoder->new([ '*' => sub{jcode(shift)->sjis}, ] ) ); #メール読み込み準備 my $parser = new MIME::Parser; $parser->output_to_core(1); $parser->tmp_recycling(1); $parser->use_inner_files(1); my $entity = $parser->parse(\*STDIN); my $subject = decode('MIME-Header', $entity->head->get('Subject')); 上記のようにして$subjectを抜き出して、>>86 を通しています。 このままですと、日本語は大丈夫で絵文字が全て〓となってしまいます。
95 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 10:24:53 ] だからどうやって処理してるかじゃなくて具体的にどういう $subjectの値がどう文字化けしたかを示せと。 俺の予想では「このプログラムに入る前から絵文字が 〓に置き換わっている」だけどなw
96 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 11:31:02 ] どんな絵文字かわからないけど、もし携帯で使うような絵文字のことなら文字コードで定義されてないんじゃない? 入出力結果はほしいね。
97 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 11:54:10 ] >>95 debugで確認して 「今日の天気は[雲の絵文字]です」が「莉頑律縺ョ螟ゥ豌励・縲薙〒縺・」 となっていました。 >俺の予想では「このプログラムに入る前から絵文字が >〓に置き換わっている」だけどなw 受け取った段階で〓ということでしょうか?
98 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 11:57:56 ] こういうときは普通16進ダンプにするものだ。
99 名前:デフォルトの名無しさん [2010/03/17(水) 12:58:07 ] cookie にメモを保存してやりたいんだけど、cookie のどの項目に保存してやればいい? このメモはクライアント側のメーカー名でこれは、CGIで取得できます。 この値をcookie に保存したいと考えています。 CGI::Cookie は理解しています。 1. expiration date 2. domain 3. path 4. secure flag とクッキーには項目がありますが、どのあたりにいれてやればいいでしょうか? また、具体的にどのように、セットすればいいでしょうか? また、 %cookies = fetch CGI::Cookie;とすることで、 ハッシュに格納できることは理解しております。
100 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 13:04:28 ] >>99 どれもハズレ
101 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 13:11:57 ] id=ID情報 memo=メモ内容 って普通に情報を記録すればいいんでないの?
102 名前:デフォルトの名無しさん [2010/03/17(水) 13:51:05 ] >>101 thank you, >id=ID情報 >memo=メモ内容 このあたり、もう少しソースコードも交えて教えてください よろしくお願いします。
103 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 14:11:17 ] どうぞおググりください
104 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 14:16:35 ] ここの"SYNOPSIS"の項目を見てピンとこなければ、>>101 の内容も理解できないし、CGI::Cookieも理解してないことになる。 search.cpan.org/dist/CGI.pm/lib/CGI/Cookie.pm 質問見る限り、Cookieについて理解がないようだからもう少しCookieというものについて調べたほうがいいよ。
105 名前:デフォルトの名無しさん [2010/03/17(水) 14:39:40 ] >>104 Ty >> >> # Create new cookies and send them >> $cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456); >> $cookie2 = new CGI::Cookie(-name=>'preferences', >> -value=>{ font => Helvetica, >> size => 12 } このSYNOPSISでは、 # Create new cookies and send them # fetch existing cookies の2通りの例が示してあるのですね。 で新たにくっきを作るときが上のコードですね。 >>$cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456); これを $cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456,-memo=>めもしたいこと); って感じにしてもいいのでしょうか?
106 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 15:05:59 ] pythonを主に使ってたのですが 他の言語がわかってる人向けのperlの教科書みたいのないですか?
107 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 15:06:20 ] 全然違うから CGI::Cookie is object oriented. Each cookie object has a name and a value. The name is any scalar value. The value is any scalar or array value (associative arrays are also allowed).
108 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 15:11:56 ] >>105 実際に試してみたらいいんですよ [14:58]% perl -MCGI::Cookie new CGI::Cookie(-name=>'ID',-value=>123456,-memo=>めもしたいこと); Unrecognized character \xE3 in column 51 at - line 1. ほら、エラーになる。日本語のところでエラーになってる。 日本語をシングルクォートでくくっても、 [15:03]% perl -MCGI::Cookie -MData::Dumper $cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456,-memo=>'めもしたいこと'); warn Dumper $cookie1; $VAR1 = bless( { 'value' => [ 123456 ], 'name' => 'ID', 'path' => '/' }, 'CGI::Cookie' ); 欲しい結果にはなってないと。って感じで自分で試さないとレス貰えないよ。
109 名前:デフォルトの名無しさん [2010/03/17(水) 15:38:26 ] >>108 thanks Data::Dumper; こんな便利なモジュールがあるんですね、ありがとうございます。 >>[15:03]% perl -MCGI::Cookie -MData::Dumper このあたり、perl -M で二つのモジュールを指定してどのような処理を行いるかすこしわからないのですが調べてみます。
110 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 16:05:19 ] >>98 すみません、ダンプするにはどうしたらよいのでしょうか?
111 名前:デフォルトの名無しさん [2010/03/17(水) 16:13:46 ] ttp://www.ietf.org/rfc/rfc2965.txt によりますと、クッキーの情報に関して、 >> set-cookie = "Set-Cookie2:" cookies >> cookies = 1#cookie >> cookie = NAME "=" VALUE *(";" set-cookie-av) >> NAME = attr >> VALUE = value >> set-cookie-av = "Comment" "=" value >> | "CommentURL" "=" <"> http_URL <"> >> | "Discard" >> | "Domain" "=" value >> | "Max-Age" "=" value >> | "Path" "=" value >> | "Port" [ "=" <"> portlist <"> ] >> | "Secure" >> | "Version" "=" 1*DIGIT >> portlist = 1#portnum >> portnum = 1*DIGIT となっております。クッキーに関しては、 >>ttp://www.thinkit.co.jp/free/article/0604/7/8/ を読みました。 >>101 のアドバイスによる、 >>id=ID情報 >>memo=メモ内容 >>って普通に情報を記録すればいいんでないの? ですが、これは、どうも、new CGI::Cookie 内に書くところがないような気がします。 どこに書いてやればいいでしょうか? アドバイスお願いします。
112 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 16:14:08 ] unpack("H*", $str);
113 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 16:30:46 ] >>111 >>108 の文章を読めばわかるはずだが、そのやり方ではできない。 WEBでサービスを利用してると、IDと一緒にパスワードも記録するってのはたまに見かけるでしょ? >>101 はIDと一緒にメモを記録しておこうってだけだよ。 #!/usr/bin/perl use strict; use CGI qw/:standard/; use CGI::Cookie; # 記録 my $cookie1 = new CGI::Cookie(-name=>'id', -value=>"ID"); my $cookie2 = new CGI::Cookie(-name=>'memo', -value=>"MEMO"); print header(-cookie=>[$cookie1,$cookie2]); # 読取 my %cookies = fetch CGI::Cookie; my $id = exists $cookies{'id'} ? $cookies{'id'}->value : "none"; my $memo = exists $cookies{'memo'} ? $cookies{'memo'}->value : "none"; print "id: $id\n"; print "memo: $memo\n"; CGIとして実行すると、初回はnone、2回目以降はIDとMEMOが表示される。
114 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 16:54:30 ] >>112 レスありがとうございます。 早速unpackの使い方を調べて @chr = unpack("H*", $subject); print "@chr\n"; を試してみました。結果は空白です。やっぱり変な変換のされ方を してしまっているのかもしれません。
115 名前:デフォルトの名無しさん [2010/03/17(水) 17:05:22 ] >>113 thank you 理解できました。
116 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 17:10:35 ] >>112 ワイド文字列をunpack 'H*'に食わせると各文字の下位8bitしか 出てこないので、俺はこんな感じの自作サブルーチン 使ってる。 sub hexdump { my($s) = @_; $s =~ s/(.)/sprintf "[%x]", ord($1)/ge; return $s }
117 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 17:17:38 ] >>116 それは>>86 のプログラムに食わす前の$subjectの値が空白だったということか? そんなら〓はどっから出てくんだよ。なんかおかしくね?
118 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 17:18:22 ] ごめんアンカミスった。>>116 じゃなくて>>114
119 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 17:29:42 ] >>117 >>86 を通る前の表示が記述ミスしていました。 「今日の天気は[雲の絵文字]です」が「cae56e29176f1367590a」となって いて、同じ方法で>>86 後の$subject_encodedをダンプすると空白になって しまいました。
120 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 17:45:06 ] >>119 雲の絵文字があるはずの7文字目の文字コードの下2桁が 13ってことだな。 雲はU+E63F 〓はU+3013 なのですでにその時点で〓になってる疑いが濃厚。 ttp://www.nttdocomo.co.jp/service/imode/make/content/pictograph/basic/index.html
121 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 18:41:41 ] >>120 文字コードを調べたらUTF-8で3013は〓でした。perlを置くサーバーにメール が届いた段階で〓に変えられているのでは、>>86 を通しても… 〓にしないでメールを受け取る方法があるのでしょうか?
122 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 20:17:55 ] 絵文字を〓に変換してるのは携帯キャリアのメル鯖。
123 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 23:34:13 ] >>121 gmailぐらいの交渉力があれば個別対応してもらえるけど、普通は 無理なんじゃないかなぁ。
124 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 09:14:35 ] >>122 >>123 まずは自社サーバーで〓に変換されていない状態で受け取れないと無理ですね。 同じようなプログラムに挑戦した方が結構いるのかと思っていました。
125 名前:デフォルトの名無しさん [2010/03/18(木) 13:38:39 ] サーバー、クライアントがあります。 クライアントがサーバーに対して GET リクエストを出します。 この際、クライアントは、 GET xxxx HTTP/1.1 User-Agent:test1 とUser-Agent のヘッダを追加します。 つまり、クライアントからのリクエスには、上のUser-Agnet のヘッダが含まれています。 サーバー上のパールプログラムの中でで、このUser-Agent の test1 を変数として保持したいのですが、具体的な実装方法に ついてアドバイスをお願いします。
126 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 13:50:15 ] >>125 $ENV{HTTP_USER_AGENT}
127 名前:デフォルトの名無しさん [2010/03/18(木) 14:10:35 ] >>126 ありがとうございます。
128 名前:デフォルトの名無しさん [2010/03/18(木) 14:35:34 ] GET /a.xml HTTP/1.1 Host: 192.16 Connection: close User-Agent: x-ModelName: pp-pppp x-SDKVersion: 1.1.1 リクエストヘッダが上のようにあり、この中で特殊な、x-ModelName の pp-pppp を取得したいと考えています。 しかし、 ttp://ja.wikipedia.org/wiki/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0#HTTP.E7.92.B0.E5.A2.83.E5.A4.89.E6.95.B0 をみますと、これに該当する環境変数がありません。 この場合、どうやって、pp-pppp を取得できますでしょうか?
129 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 15:07:57 ] >>125 ,128 板違い >>126 みたいに板違いなのに回答するとこうやって図にのるのでみんなやめようね
130 名前:デフォルトの名無しさん [2010/03/18(木) 16:00:44 ] >>129 どこの板に質問すればいいでしょうか?
131 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 16:03:03 ] >>130 >>1 読め
132 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 16:03:13 ] >>130 >>1 読め
133 名前:デフォルトの名無しさん [2010/03/18(木) 16:07:58 ] >>131 >>132 thank you.
134 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 10:18:39 ] 初歩的な質問ですみません。 改行コードを変換したいんですが ・次行の先頭が 'A' で始まる場合のみ、行末の改行を削除 これを perl -pe 's/\nA//g' とやっても期待した結果になりません(全く完全に何も置換されない) 環境はCygwin1.7です。
135 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 10:42:54 ] Treat string as multiple lines
136 名前:デフォルトの名無しさん [2010/03/19(金) 10:54:20 ] >>134 s/\n(?=:A)//sg
137 名前:デフォルトの名無しさん [2010/03/19(金) 10:59:03 ] 間違えた >>134 s/\n(?=A)//sg
138 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 15:57:58 ] 改行区切りで読み込んでるからだろ perl -p0e 's/\n(?=A)//g'
139 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 06:01:46 ] otsuneさんがウザくてamachangが爽やかなのはperlのせいですか?
140 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 06:21:57 ] はてなに帰れ
141 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 08:43:37 ] 「処理済み」を表すフラグの変数名は何がいいですか?
142 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 08:56:41 ] done
143 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 09:02:41 ] ああ、それはいいな finishとかprocessedとか、どうもしっくり来なかった
144 名前:デフォルトの名無しさん [2010/03/26(金) 13:04:37 ] http::request の使用に関しての問題ですが、perl のプログラム(リフェレンス)の問題に なりますのでここで質問させてもらいます。 ttp://search.cpan.org/~gaas/libwww-perl-5.834/lib/HTTP/Request.pm によりますと、 $r = HTTP::Request->new( $method, $uri, $header_ref, $content ) で三番目の引数が、reference to an HTTP::Headers object or a plain array reference of key/value pairs. とリフェレンスになっております。 Can't call method "clone" on unblessed reference at C:/Perl/lib/HTTP/Message.pm line 32. *たしかに、message.pm 内では、$header = $header->clone; となっております。 my %header = ('User-Agent' => 'test_Agent','Content-Type' => 'application/x-www-form-urlencoded'); my $header_ref = \%header; と三番目の引数をセットしています。 ttp://ftp.ics.uci.edu/pub/websoft/libwww-perl/archive/1999h1/0500.html 解決方法は、このあたりに書いてあるとおもうのですが、どのように三番目の引数をセットしてやればいいでしょうかアドバイス願います。
145 名前:デフォルトの名無しさん mailto:sage [2010/03/26(金) 13:20:33 ] >>144 HTTP::Headersのオブジェクトにしたら良いよ my $h = HTTP::Headers->new('User-Agent' => 'test_Agent','Content-Type' => 'application/x-www-form-urlencoded'); この$hを第三引数に。
146 名前:デフォルトの名無しさん mailto:sage [2010/03/26(金) 13:22:28 ] plain array referenceって書いてあるんだから、ハッシュじゃだめだろ。 my @header = ('User-Agent' => 'test_Agent','Content-Type' => 'application/x-www-form-urlencoded'); my $header_ref = \@header;
147 名前:デフォルトの名無しさん mailto:sage [2010/03/26(金) 13:25:15 ] エラーメッセージの行のまわりを見ればこうなっているわけだが。 if (ref($header) eq "ARRAY") { $header = HTTP::Headers->new(@$header); } else { $header = $header->clone; }
148 名前:デフォルトの名無しさん [2010/03/26(金) 13:50:13 ] レスありがとうございました。 解決いたしました。 >>145 オブジェクトを指定してうまく動作しました。 >>146 plain array reference を読み間違えておりました。配列であってハッシュではありませんでした。 >>147 アドバイス ありがとうございました。
149 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 00:11:17 ] perlから外部コマンドを実行して出力を格納するのに バッククオートを使用しているのですが、 コマンドの文字列に$を含むような場合(環境変数とか)に 変数として展開されないようにする方法ってありませんでしょうか。
150 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 09:38:32 ] $を適切にエスケープすりゃいいんじゃねーの? またはperlipc(1)の例にあるsafe backtick # add error processing as above $pid = open(KID_TO_READ, "−|"); if ($pid) { # parent while (<KID_TO_READ>) { # do something interesting } close(KID_TO_READ) || warn "kid exited $?"; } else { # child ($EUID, $EGID) = ($UID, $GID); # suid only exec($program, @options, @args) || die "can't exec program: $!"; # NOTREACHED }
151 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 16:02:53 ] お前らモダンPerlで書いてる? 俺はまだ勉強してないんだけど モダンPerlの利点って何があるのか簡潔に書け。
152 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 17:14:04 ] Perl4互換で書いてる。念のため
153 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 17:42:38 ] Mooseとかは使わないけどPerl4互換とか絶対あり得ないわw
154 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 18:45:16 ] 自分で使うためのものしか考えてないから、5.10で追加されたものも普通に使って書いてる いまさらPerl4互換とかないわー
155 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 18:49:09 ] perl4ってどんなの? localとか使うん?
156 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 19:38:50 ] >>155 www2n.biglobe.ne.jp/~kajino/perl4ref/
157 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 19:48:28 ] 関数の引数は、localで受ける方が自然に見えるのは俺だけ? sub func { local($x, $y)=@_; まあ慣れなんだけど
158 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 20:10:32 ] おまえとKENTだけ
159 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 20:21:09 ] myだろ普通 JavaとかPHPとか他の言語は自動的に局所変数だ
160 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 09:35:47 ] 最近は受ける変数名を考えるのが面倒だから $_[0]とかを直接使ってるw
161 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 13:56:50 ] pythonのctypesに相当するものはありますか?
162 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 14:03:11 ] ん?PythonってCのやり方に頼りだしたんだw
163 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 14:04:47 ] 書き忘れた CPANでCtypeで検索しろ
164 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 11:12:09 ] swigしかないようです
165 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 12:40:00 ] Archive::Zipの解説しているWebPageないでしょうか。 できれば日本語で・・・ ぐぐっても、圧縮/解凍のやりかたしか出てない;;
166 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 16:31:31 ] >>165 「圧縮/解凍のやりかた」以外の何を知りたいのか 具体的に書くべきだろうな、そういう時は。 「マニュアルに書かれている内容が理解できないので 噛み砕いて教えて下さい」って言ってるのと同義なんだから。 search.cpan.org/dist/Archive-Zip/lib/Archive/Zip/FAQ.pod search.cpan.org/dist/Archive-Zip/lib/Archive/Zip.pm
167 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 16:48:45 ] >>166 すみませんでした。 具体的にやりたいのは、画像ファイルを無圧縮ZIPに固めておき、それを解凍せずにブラウザに表示したいのです。 ローカルファイルを開いたハンドルから表示するのは出来たので、 ZIP内のファイルのハンドルが取れれば、出来そうなのですが・・・ my $zip = Archive::Zip->new('test.zip'); my $fh = $zip->open('hoge.jpg'); みたいに出来たらな・・・と。
168 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 19:22:43 ] >>167 お望みの物はArchive::Zip::MemberReadかい
169 名前:デフォルトの名無しさん mailto:sage [2010/03/30(火) 15:14:12 ] >>168 ありがとうございます。 早速調べて試してみたのですが、Not a GLOB reference のエラーが出ます。perl は初めてなので、なにか勘違いしていると思いますが、それがどこかわかりません。 #!/usr/bin/perl use Archive::Zip; use Archive::Zip::MemberRead; $imgtype = 'jpeg'; #// file @ # open(IMG, "./1.jpg") or die; #// zip A $zip = Archive::Zip->new('./1.zip'); $IMG = Archive::Zip::MemberRead->new($zip, "1.jpg"); #// イメージ表示 binmode $IMG; binmode STDOUT; print "Content-type: image/$imgtype\n\n"; print while (<$IMG>); #// 画像クローズ close($IMG); #// 終了 exit(0); @を生かし、Aを殺すとうまくいきますが、逆だと binmode $IMG の箇所でNot a GLOB referenceとなります
170 名前:デフォルトの名無しさん mailto:sage [2010/03/30(火) 16:28:22 ] Archive::Zip::MemberReadは中をのぞいてみたけど ハッシュをblessしただけの普通のオブジェクトだから ファイルハンドルとしては使えない。あくまで同じような メソッドが用意してあるだけの普通のオブジェクト。 binmodeとかはムリ。 IO::Stringみたいにグロブにtieしていろいろがんばれば なんとかなるけどそこまではやってないようです。
171 名前:デフォルトの名無しさん mailto:sage [2010/03/30(火) 16:55:00 ] テンポラリに展開して、それを読み込んだほうが良さそうですね。 そういう方向で修正していって見ます。 わざわざ中をのぞいていただき、ありがとうございました。
172 名前:デフォルトの名無しさん mailto:sage [2010/03/31(水) 21:16:21 ] ドキュメントぐらい読めよ関数名見りゃだいたい分かるだろ $zip->contents(FILENAME);
173 名前:デフォルトの名無しさん mailto:sage [2010/04/01(木) 11:14:51 ] >>172 テンポラリファイルを使用する形で出来上がっていましたが、$zip->contents(FILENAME)を使用することで 「ファイルの書き込み→読み込み→出力」が、「ファイルの読み込み→出力」にすることが出来ました。 画像の縮小をさせるとレスポンスが遅いのですが、玄箱には重過ぎるのでしょう。 まだフロント(iアプリ)はテスト用でしか試してませんが、なんとか目処がつきました。 ありがとうございます。
174 名前:デフォルトの名無しさん mailto:sage [2010/04/01(木) 17:09:07 ] Perlのバイブル本って何?
175 名前:デフォルトの名無しさん mailto:sage [2010/04/01(木) 17:12:59 ] プログラミング言語Perl
176 名前:デフォルトの名無しさん mailto:sage [2010/04/01(木) 17:31:06 ] 正直最初にその1冊買ってそれが最後の本になるなw あとはCPANとかでいろいろ探しまくる作業が残りの半分。
177 名前:デフォルトの名無しさん mailto:sage [2010/04/01(木) 17:40:50 ] >>175 どの本ですか? アマゾンなどのリンクください。 プログラミング言語Perlマスターコース プログラミングPerl という本なら見つかるのですが
178 名前:176 mailto:sage [2010/04/01(木) 17:43:19 ] ああ、俺が言ってるヤツは プログラミングPerl。 オライリーのらくだ絵の本。Perl開発者が書いたやつ。
179 名前:デフォルトの名無しさん mailto:sage [2010/04/01(木) 19:04:29 ] モダンPerl読んだ方がいいと思う
180 名前:デフォルトの名無しさん mailto:sage [2010/04/01(木) 19:14:03 ] それバイブルどころか入門書じゃないの?
181 名前:デフォルトの名無しさん mailto:sage [2010/04/01(木) 19:30:19 ] プログラミングPerlって説明が古いじゃん
182 名前:デフォルトの名無しさん mailto:sage [2010/04/01(木) 23:06:19 ] Effective Perlがいいぞ
183 名前:デフォルトの名無しさん mailto:sage [2010/04/01(木) 23:17:35 ] モダンPerlはサスペンダーが大絶賛してたから意地でも読まない
184 名前:デフォルトの名無しさん mailto:sage [2010/04/01(木) 23:57:33 ] 江川達也さんは何の本でもたいしてちゃんと読まずに大絶賛するだろうが
185 名前:デフォルトの名無しさん mailto:sage [2010/04/02(金) 00:19:10 ] モダンPerl読んだけど、情報がとびとびでさっぱり理解できない 初心者にすすめるもんじゃないよありゃ
186 名前:デフォルトの名無しさん mailto:sage [2010/04/02(金) 02:40:11 ] プログラミングPerlは思想的に面白い。 Perl6なんて本当は完成させたくないんだよ。 綺麗すぎる言語は退屈だ。
187 名前:デフォルトの名無しさん mailto:sage [2010/04/06(火) 00:05:27 ] Linux上で動かすPerlについて質問があります。 ファイルリストに記載されているファイルのみを 別のディレクトリにコピーしたいのですが、 どのようなコードを書けばよいのでしょうか? ファイルリストを読み込み、$file_listで1文字ずつ表示させる状態にして、 system("cp $file_list $dir_name");とやっているのですが、うまくいきません。
188 名前:デフォルトの名無しさん mailto:sage [2010/04/06(火) 00:16:52 ] >>187 print `cp $file_list $dir_name`; エラーがあるならこれで分かるんじゃないか
189 名前:デフォルトの名無しさん mailto:sage [2010/04/06(火) 00:31:12 ] 俺の予想では、chompするとうまくいく
190 名前:デフォルトの名無しさん mailto:sage [2010/04/06(火) 04:09:32 ] 俺が touch ';rm -fr /;' しといてやるぜw >>187
191 名前:デフォルトの名無しさん mailto:sage [2010/04/06(火) 20:19:04 ] blessしたオブジェクトをscalar($self)した時に 任意の文字列を返すにはどうすればよいでしょうか? 例えばDateTimeモジュールはDateTime->now()でオブジェクトを取得しますが、 scalar($now)すると現在時間が文字列で返ってくるのですが、 こういうのはどう実装すればよいでしょうか?
192 名前:デフォルトの名無しさん mailto:sage [2010/04/06(火) 20:38:04 ] 少なくともDateTimeではscalar使った時点で文字列に変わったりはしない print $now; とか my $datestr = "$now"; で文字列になることを言ってるんなら、overload
193 名前:デフォルトの名無しさん mailto:sage [2010/04/08(木) 01:08:37 ] >191 use overload ( 略 '""' => '_stringify', 略
194 名前:デフォルトの名無しさん [2010/04/10(土) 00:38:14 ] どうしても文字化けしてしまいます。 どなたかヒントでも頂けるとありがたいです。 WWW::Mechanize でCSVをダウンロードします。 その後print や Encode::decode などすると「Wide character ....」 と表示されました。 UTF8フラグが立っているのかと思い、Encode::encode("utf8",$data_str) などして、 ファイルを保存して開いてみると文字化けしてしまいます。 エディタはEmacsでエンコード指定して開き直したりもしてみました。 本当に試行錯誤して、encodeやdecodeのいろんな指定をしてみましたがダメでした。 しかしブラウザからCSVをダウンロードするとエクセルできちんと開きますし、 Emacs で UTF-8 で開くことが出来ます。 正直、分かりません・・・。
195 名前:デフォルトの名無しさん mailto:sage [2010/04/10(土) 00:43:24 ] Encode::from_to($data_str, "utf8", "cp932");
196 名前:デフォルトの名無しさん mailto:sage [2010/04/10(土) 01:25:59 ] >>194 わかってないなら弾の言う通りに書けよ。
197 名前:194 mailto:sage [2010/04/10(土) 02:00:29 ] 単純にdos窓で表示できない、と言う訳ではありません。Emacsで開いているので。 ブラウザで落とすとUTF8になっているので、ファイルはUTF8なんだと思うんですが。。 Mechanizeのcontent には独特なエンコードルールが有るんでしょうか? contentのデータをencodeするのがマズイのかな。
198 名前:デフォルトの名無しさん mailto:sage [2010/04/10(土) 02:23:11 ] Mech使わないから知らんけど、LWP::UserAgentとかみたいにHTTP::Responseでデータ返してくれるんなら my $content = $res->decoded_content(charset => 'none'); # $res isa HTTP::Response で生データ取れるからそれをそのまま保存するなりすればいいかと。
199 名前:デフォルトの名無しさん mailto:sage [2010/04/10(土) 02:42:18 ] 文字化けとかUTF8と思うとか曖昧なこと言わないで バイナリエディタで中身見ればいいのに
200 名前:デフォルトの名無しさん mailto:sage [2010/04/10(土) 02:54:08 ] >ファイルはUTF8なんだと思うんですが。 思うってなんだそりゃw 自分で見てから判断しれよ
201 名前:デフォルトの名無しさん mailto:sage [2010/04/10(土) 04:20:49 ] >>194 とりあえずDevel::Peekなりでdumpしてutf8flagが立ってるかどうかをちゃんと確認した方がいい。 曖昧なまんまの推測だと答えも推測になるからなかなか答えにたどり着かんよ
202 名前:デフォルトの名無しさん mailto:sage [2010/04/10(土) 05:28:58 ] >>194 iso-8859-1なんじゃねえの?
203 名前:デフォルトの名無しさん mailto:sage [2010/04/11(日) 00:35:30 ] Spidering Hacksに載ってたな
204 名前:デフォルトの名無しさん mailto:sage [2010/04/11(日) 00:42:17 ] Spidering Hacksの内容は今となってはさすがに古過ぎる スクレイピングのマナーとか心構えとかは参考になるけどな
205 名前:デフォルトの名無しさん [2010/04/14(水) 19:52:51 ] もう5年以上前になると思いますが、 Perlで書かれたプログラムを実行するとラクダの形で文字列が出力され、 そのプログラム自体もラクダの形に揃えられていたものをみたのですが、 探してみてもなかなかみつかりません。 少ない情報ですが、お分かりの方はいませんでしょうか?
206 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 20:21:48 ] Acme::EyeDropsじゃねーの
207 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 23:32:19 ] URLを画面に表示する時に、指定した文字数より長すぎる場合、 ディレクトリ階層を優先してまびくようにするにはどうしたらいいでしょうか? 例: $url = "www.abc123.net/abcdefg/hijklmn/opqrstu/vwxyz/foo1234.html " ←65文字 $url = omiturl($url, 50); print $url; この結果としてこんな感じにしたいです www.abc123.net/ ... /vwxyz/foo1234.html ←47文字
208 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 00:36:20 ] >>207 use URI; sub omiturl { my $uri = URI->new(shift); my $maxlen = shift; my $repl_q = quotemeta(my $repl = "..."); my $path = $uri->path; until (length "$uri" <= $maxlen) { $path =~ s,\A/(?:$repl_q/)?[^/]+,/$repl, or last; $uri->path($path); } return "$uri"; } 手っ取り早くURI使ってるから$replに半角スペースとか使うと%20にされちゃうんで、 そのへん気に入らなかったら適当に直してくれ
209 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 04:53:00 ] >>208 便利につかわさせて頂きます。 ありがとうございました。
210 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 05:59:51 ] localhost/p2/read.php?host=pc12.2ch.net&bbs=tech&key=1266565626&ls=208-#r208 のようなクエリ文字列 or フラグメントの長いURLを>>208 に通すと無限ループするな 見た感じだとマッチしなくなった時点でループを抜けるように書かれてると思うけど、なぜだろう
211 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 06:53:08 ] マッチもしないし文字数もこれ以上短く出来なくなったら無限ループだな。 例えば文字の長さを10とかやったら絶対無限ループ
212 名前:208 mailto:sage [2010/04/16(金) 10:08:30 ] oh…やっちまった……テストはちゃんと書きましょうってことだな… untilを↓に差し替えで無限ループは回避できるはず。>>207 がまだ見てることを祈る… for (my $i = 0; length "$uri" > $maxlen and $i < 20; $i++) { # ループ20回で強制的に抜ける $path =~ s,\A(/(?:$repl_q/)?[^/]+),/$repl, or last; last if $path eq $1; # マッチするが置換しても内容が変わらない場合抜ける $uri->path($path); }
213 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 22:26:22 ] Cだと static char hoge[128]; write(fd, hoge, 128); とすれば128バイト分の0x00が書き込まれると思うのですが perlだとどのように記述すればいいでしょうか?
214 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 22:45:34 ] print 0x00 x 128;
215 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 22:46:25 ] あ、ごめん "\x00" x 128 だ
216 名前:デフォルトの名無しさん mailto:sage [2010/04/17(土) 00:38:56 ] >>214 >>215 ありがとうございます、繰り返し演算子という奴を使うんですね。
217 名前:デフォルトの名無しさん mailto:sage [2010/04/17(土) 16:23:26 ] 配列の任意の位置に要素を入れるにはどうすればいいのでしょうか? my @arr = qw(a b c d e); my $i = 3; ??? add_elem @arr, $i, "z"; print "@arr"; #=> a b c z d e
218 名前:208 mailto:sage [2010/04/17(土) 17:34:11 ] splice @arr, $i, 0, "z";
219 名前:デフォルトの名無しさん mailto:sage [2010/04/17(土) 18:05:40 ] >>218 d できました
220 名前:デフォルトの名無しさん [2010/04/21(水) 18:25:44 ] require HOGE::FUGA; を require $foo; みたいにして、 HOGE::FUGAの代わりにHOGE::PIYOを読むように動的に変更したいのですが、 この場合'HOGE/FUGA.pm'ってパス指定しないとうまくいきません。 出来ればHOGE::PIYOのような形式で指定したいのですが、 上手い方法はないでしょうか?
221 名前:デフォルトの名無しさん [2010/04/21(水) 18:26:35 ] なるほど、evalの中でrequireするか、でなければUNIVERSAL::require使えばよいのか。
222 名前:デフォルトの名無しさん [2010/04/22(木) 00:53:15 ] こんばんは Perlでグラフを書く必要がありGD::Graphというモジュールを発見したので 使おうと思っていろいろ調べました。 その結果、このモジュールは軸を対数表示にすることができない?ようなんですが この認識であってますかね? search.cpan.org/~mverb/GDGraph-1.43/Graph.pm
223 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 00:58:38 ] 対数計算した座標渡せばいいだけでは
224 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 02:12:27 ] それだとグラフ自体は意図通りに描画されるかも試練が 軸の目盛り(?)が意図したようにならんのでは?
225 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 05:03:24 ] じゃあ使うのやめれば
226 名前:224 mailto:sage [2010/04/22(木) 11:20:42 ] おれは使ってないぞw
227 名前:デフォルトの名無しさん [2010/04/22(木) 19:34:23 ] >>223 レスありがとうございます。 描画はそれでいけますが素直にgnuplotのほうが無難かな。
228 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 22:51:17 ] データだけ吐いてR言語がいいぞ
229 名前:194 mailto:sage [2010/04/22(木) 23:50:50 ] 文字化け use strict; use warnings; use utf8; use Encode; use Net::Delicious; my $delicious = Net::Delicious->new({user=>'hoge',pswd=>'fuga'}); my $agent = LWP::UserAgent->new; foreach my $bookmark ( $delicious->recent_posts ) { my $url = $bookmark->url(); print utf8::is_utf8($bookmark->description) . "\n"; my $title = Encode::encode('utf8',$bookmark->description); my $tags = Encode::encode('utf8',$bookmark->tags); $tags =~ s/([^ ] )/#$1/g; print $title . "\n"; print $tags . "\n"; print "---------------------------------------------\n"; } 上のようなスクリプトをかきましたが、descriptionが文字化けしてしまいます。 Net::Delicious からとったデータはutfフラグがたっていたので、そのままencodeしました。 UTFフラグがたったものをencodeして文字化けする場合はどのように対処すれば良いでしょうか?
230 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 02:37:56 ] >>229 試してみたけど文字化けしないな 使い方も問題なさそうだけど
231 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 15:55:39 ] >>229 cpan moduleがencodeに対応してたりしてなかったりするものを混ぜると わけわかんなくなる場合がある。 関係してそうなmoduleかたっぱしからupdateしてみ
232 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 16:31:43 ] package TestC; sub new{ my $class = shift; my $self = { a => [], }; return bless $self, $class; } ---- my $c1 = new TestC; my $c2 = new TestC; としたときに $c1 と $c2 の a が同じものになってしまいます。 ($c1 で編集すると $c2 も同じになる) インスタンスごとに配列も別の実態を参照してほしいのですがどうすればよいでしょうか?
233 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 16:50:56 ] 普通ならないけどな。編集して同じになったというのが わかるソースも出せよ。 package TestC; sub new{ my $class = shift; my $self = { a => [], }; return bless $self, $class; } package main; $c1->{a}->[0] = 100; printf "c1: %d, c2: %d\n", $c1->{a}->[0], $c2->{a}->[0]; すくなくとも上記で試した限りでは結果は c1: 100, c2: 0 だった。
234 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 16:55:03 ] >>232 別物みたいだけど? package main; my $c1 = new TestC; my $c2 = new TestC; warn '$c1->{a} and $c1->{a}: ' . is_equal($c1->{a}, $c1->{a}); warn '$c1->{a} and $c2->{a}: ' . is_equal($c1->{a}, $c2->{a}); sub is_equal { my($x, $y) = @_; ($x eq $y) ? 1 : 0; } package TestC; sub new{ my $class = shift; my $self = { a => [], }; return bless $self, $class; } 1; ==================== $c1->{a} and $c1->{a}: 1 $c1->{a} and $c2->{a}: 0
235 名前:232 mailto:sage [2010/04/23(金) 17:05:46 ] >>233 すいません、長くなりそうなのではしょってしまいました。 以下を実行すると c1 2 c2 2 と表示されます。@5.10.0 package TestC; ####new省略 sub push_array{ my $self = shift; my $a = $self->{a}; push @a, $_[0]; } sub get_count{ my $self = shift; my $a = $self->{a}; return @a; } package main; my $c1 = new TestC; my $c2 = new TestC; $c1->push_array(1); $c2->push_array(2); print "c1 ".$c1->get_count."\n"; print "c2 ".$c2->get_count."\n";
236 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 17:18:56 ] use strictしなかった結果がこれだよ!
237 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 17:40:45 ] $a!
238 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 17:43:02 ] $a ≠ @a
239 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 17:44:47 ] $aと@aは全くの別物。このプログラムに登場する@aはmyで宣言されてない から常に同じパッケージ変数が使われてる あと$a, $bはsortが使う特別な変数なのでそれ以外の用途で使うとろくな目に 会わないからやめとけ。
240 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 20:07:59 ] $a使った結果がこれだよ!
241 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 20:08:54 ] sortが$a, $bを使うという仕様を見た時は目ん玉飛び出たな どんな糞仕様だよと
242 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 20:56:57 ] どこが? Perlなら妥当な仕様だろ。
243 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 21:14:28 ] $_ とか $@ とか $! とかも糞仕様
244 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 21:26:09 ] つまりPerlは糞言語だから糞仕様なのがむしろ妥当だと
245 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 22:34:24 ] $aと$bをどう使うと降順になるのか何度やっても覚えない そもそも、降順と昇順の意味がピンと来ない
246 名前:232 mailto:sage [2010/04/23(金) 22:44:39 ] 返答が遅くなり申し訳ありません。 色々と得心がいきました。 解決したところで引き続き頭をこねこねしたいと思います。 ありがとうございました。
247 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 23:26:38 ] $_やら$@やら$!はだれがプログラムしても同じ変数だから分かりやすい っていう話があってだな
248 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 00:01:40 ] >>247 なるほど そう考えると確かにと思わざるを得ない ただあまり使わない特殊変数は検索かけても引っかかってこないのがウザい
249 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 00:03:24 ] perldoc perlvar
250 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 00:26:59 ] とりあえず>>245 が頭が悪いと言う事はわかった
251 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 01:56:06 ] UTF-8 で書かれたテキストファイル hoge.txt の内容を Windowsのバッチファイルからワンライナーで msg="おはよう" から msg=こんにちは に置換したいんですが・・・ perl -i.BAK -pe "s/(?<=msg=).*/こんにちは/" hoge.txt これだとシフトJISで書き込まれてしまうんです。 UTF-8 で書き込む方法があれば教えてください。
252 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 10:37:27 ] 見つけたよ特殊変数のスレ 同じプログラム板じゃないか Perlの特殊変数は氏ね。絶対に使うな。可読性下がる pc12.2ch.net/test/read.cgi/tech/1141988910/34 34 名前:デフォルトの名無しさん[sage] 投稿日:2006/03/11(土) 22:02:24 特殊変数は、他人や「昔の自分」が書いたソースに出てきても まったく可読性に影響の無い、数少ない構成要素の一つだろう。 同じ名前の変数には、常に同じ意味を持つものが入ってるんだから。 「これ何のためにあるの?何が入ってるの?」って状態になるのは普通の変数のほう。
253 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 14:02:59 ] >>251 文字コードがsjisであれば、 perl -i.BAK -pe -MEncode "s/(?<=msg=).*/Encode::from_to('こんにちは','sjis','utf8')/e" hoge.txt >>252 可読性とか書きようによってはいくらでも良くなるし悪くもなるもんなのに、言語仕様のせいにするのはおかしいよね。 他の言語から見れば、Perlは変数の前に$@%*とか使ったり、特殊変数の意味が理解できないだろうから気持ち悪く映るんだろうけど。
254 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 18:26:39 ] $@%があるからスカラなのか配列なのか、分かりやすくて良いと思う俺って少数派?
255 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 18:27:43 ] 多数派
256 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 20:20:59 ] じゃあリファレンスも別のプリフィクスを採用するべきだったよね あと配列もハッシュも中身にアクセスするとき$プリフィクスを要求するのは分かりにくいよね(これはperl6で変更になるけど)
257 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 20:23:23 ] あれはあれでいいんだよ
258 名前:194 mailto:sage [2010/04/24(土) 20:59:32 ] >>231 ,230 Macだといけました。 Windowsだと化けるんだな。。 ppmのモジュールは確かに古かったから、cpanで入れ直してみようかと思います。 ちなみにeshellで出力してるので、winでもcp932にencodeしなくても大丈夫です。 てかこれで途中までは日本語がきちんと表示されます。
259 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 01:08:38 ] >>256 おれはperl5の方が好きだ スカラだから$で統一されててわかりやすい
260 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 03:03:46 ] 最終的に得るものがスカラ、という考え方か 例えばデリファレンスで配列を得たけりゃ@$array_refだし 確かにそりゃそうだなぁ
261 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 05:23:43 ] あれだよな。@は配列変数 って書くサイトや本が悪いよな。 配列へのアクセスなのに。
262 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 10:58:03 ] >>260 そういう思想で作ってあるって習ったから覚えやすかった
263 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 14:29:25 ] @names = ('OZA-', 'POPPO', 'MASZOE'); @mes = ('012345678901234567890123456789', 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほ', いいいいい); 例えばこのようなものを、次のように2つのカラムがあるかのように出力したいのですが、どうしたらできるでしょうか? OZA- .| 012345678901234567890123 ...| 456789 POPPO | あいうえおかきくけこさしすせそたちつてとなにぬ ...| ねのはひふへほ MASZOE .| いいいいい こんなのでできるかなと思ったのですが無理でした… format AAA = @<<<<<<<<<< | @<<<<<<<<<<<<<<<<<<<< ~~ | @<<<<<<<<<<<<<<<<<<<< . よろしくお願いします。
264 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 14:47:40 ] と思ったらformatでできました。お騒がせしました。
265 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 19:20:18 ] >>253 ありがとうございます。すごい勉強になります。 > perl -MEncode -i.BAK -pe "s/(?<=msg=).*/Encode::from_to('こんにちは','sjis','utf8')/e" hoge.txt だと Modification of a read-only value attempted at C:/Perl/lib/Encode.pm line 195, <> line 280. って叱られるので perl -MEncode -i.BAK -pe "s/(?<=msg=).*/$s='こんにちは';Encode::from_to($s,'sjis','utf8');$s/e" hoge.txt でできました! Jcode使えば少し短くなりました perl -MJcode -i.BAK -pe "s/(?<=msg=).*/Jcode->new('こんにちは','sjis')->utf8/e" hoge.txt
266 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 12:59:43 ] Perlの特殊変数って言っても、使うのは $_ $@ @_ とかほとんどこんなもんだろ。全部覚えてる奴なんてまずいない。
267 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 14:39:27 ] 最低限:$_ @_ $1〜$9 $a $b 覚えてると便利:$@ $! $. $/ $? $$ ゴルフやるなら:$\ $, $" $& $` $' @F
268 名前:デフォルトの名無しさん [2010/04/26(月) 21:46:22 ] open IN,"file"; while(<IN>){ $str .= $_; } file内のテキスト全てを、$strというスカラー変数に代入してみました。 ファイルサイズが小さければ問題ないが何万行とかだと代入処理に失敗しますよね?
269 名前:(!>>268) mailto:sage [2010/04/26(月) 22:29:11 ] そういえば数値はスカラに2^1023以上、2^1024未満が入ったけど、 このヘンの上限というか仕様ってどこか載ってます?
270 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 23:29:24 ] >>266 それは文法の一部で、特殊変数じゃない
271 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 02:49:33 ] >>268 open IN,"file"; read IN,$str,-s IN;
272 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 03:17:45 ] use File::Slurp; $str = read_file('filename'); >>268 メモリあれば大丈夫だよ。ただ毎行 .= すると遅い
273 名前:デフォルトの名無しさん [2010/04/27(火) 17:40:54 ] 教えてエロい人 perlはいつからスカラの要素を参照するときに@で参照できるようになったんだ? my @sca = (1,2,3); print $sca[1]; // OK... print @sca[1]; // OK?! @sca[1] = 'x'; print @sca[1]; // OK?!?!
274 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 17:49:04 ] >>273 それスカラじゃなくてたまたま1要素の配列スライス。 配列スライス自体はperl4の昔からすでにあった。 それより前はシラネ
275 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 17:53:30 ] my @sca = (1,2,3); @sca[0..2] = "a".."c"; print @sca[0..2], "\n", @sca[0, 2], "\n", @sca[0];
276 名前:273 mailto:sage [2010/04/27(火) 18:08:51 ] >>274 ,275 なるほど!とんくす!
277 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 21:10:07 ] xpでactiveperl v5.8.9を使ってたら、 使えてたスクリプトが急に「問題が発生したため」云々のウィンドウを出して止まるようになった ファイルが12728あるディレクトリでreaddirをしたのが原因みたい ファイルの少ないところで使うと問題ない なんか制限あったっけ
278 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 21:25:34 ] 違った 260文字あるファイル名のせいだった
279 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 17:50:08 ] Perl/Tkで作ったテキストウィジェットに1秒置きに1-10の数字を表示させるにはどうすれば良いですか?
280 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 22:56:37 ] >>279 search.cpan.org/~srezic/Tk-804.028/pod/after.pod
281 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 15:50:31 ] バッチファイル(hoge.bat)の1行目に PATH C:\hage;%PATH% と「挿入」したいんですけど、 ワンライナーでできますか? できるならやり方を教えてください。
282 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 16:00:35 ] open BAT '>hoge.bat'; print BAT 'PATH C:\hage;%PATH%';print BAT <BAT>; こんな感じ?
283 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 16:07:04 ] 愚直に perl -e "open my $FH,'<','hoge.bat';my @l=<$FH>;close $FH;open $FH,'>','hoge.bat';print $FH \"PATH C:\\hage;\%PATH\%\n\",@l;"
284 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 16:15:23 ] perl -p0i -e 's/^/PATH C:\\hage;%PATH%\n/' hoge.bat Windowsだとシングルクオートじゃなくてダブルクオートじゃないとだめなんだっけか でもこのままやると%PATH%が展開されちゃったりするのか?よくわからんから適当に直してくれ
285 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 17:13:28 ] >>284 できました!ありがとう。 perl -i.BAK -p0 -e "s/^/PATH C:\\hage;%%PATH%%\n/" hoge.bat
286 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 01:58:11 ] perlのスクリプトを含むWindowsのパッケージを setup.exe みたいな塊にまとめたいのですが 何がおすすめでしょうか? 昔単なる実行ファイルだけのときは innoSetup使ってたけど
287 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 07:21:30 ] PAL Perl2EXE
288 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 12:04:34 ] 関数の命名でヒントください 「array化」を英語で書くとしたら 「arraylize」「arrailise」「arrailize」、 どれにしたらよいでしょうか? テキストを読みこんで、それを配列に格納する というありふれた機能を持つ関数の名前です 下のように使っています my @list = arraylize ( "list.dat" ) ; sub arraylize { my $name = $_[0] ; open ( FH ,"< $name" ) ; my @listArray = <FH> ; close (FH) ; return @listArray ; } 他にも、もっと語呂のいい名前があったら教えてください それ以前に、同じような動作をするものがあったら知りたいです
289 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 12:16:00 ] いきなりファイル名でというのは知らないけど、強いて言えば IO::Handleのgetlinesが近いかなぁ。 本題とは関係ないが、せめてopenのエラー処理( or die $! をつける程度でいいよ)はやっとけ。後で苦労するぞ。
290 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 12:27:01 ] 「ファイルを読み込んで配列を返す」処理につける名前にしちゃ arraylize は筋が悪いな readfile なり readlines なりでいいだろ どうしても array が重要だっつーんなら make_array
291 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 12:30:10 ] まんまでいいなら、file2array
292 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 12:35:40 ] sub arraylize { my $name = shift ; open ( my $fh ,"<", $name ) ; my @listArray = <$fh> ; close ($fh) ; return @listArray ; } 関係ないけど
293 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 12:39:50 ] >「arraylize」「arrailise」「arrailize」 l はどっから出てきたんだよ
294 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 13:18:58 ] セパレータが指定されたら split した配列を返したり、 配列だったらそのまま返したり、 ハッシュだったら key/value をセパレータで繋げた配列を返したり・・・ そこまでやって、初めて arraylize を名乗っていい。 そう思うんだ。 どうでもいいけど
295 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 13:37:18 ] to_arrayじゃダメなん?
296 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 14:12:49 ] ありがとうございます 単純にfile2arrayにします エラー処理や ファイルハンドルに$fh、 そこのところ貰います
297 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 14:42:16 ] my %tmp; @tmp{qw(foo bar baz)} = split(/,/, $_, 3); push(@result, \%tmp); みたいなコードがあるんですが、これを %tmp を使わずに一行で済ます書き方ってあるでしょうか。 mapあたりでできそうなんだけど思いつかない… (foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。
298 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 14:51:29 ] >>288 わざわざ作らんで use File::Slurp; my @list = read_file("list.dat"); しなよ。
299 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 14:58:34 ] >>297 > (foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。 List::MoreUtilsになにかあるんじゃ
300 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 15:01:31 ] perl -e "print ((qw(foo bar baz),split(/,/, 'xxx,yyy,zzz'))[map{$_,$_+3}(0..2)]); fooxxxbaryyybazzzz あんまやるもんじゃないな
301 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 16:11:01 ] 頭がおかしくなりそうだ TMTOWTDIと言うけど、杉樽歯泳場猿画五都市と言う名言もあるし
302 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 16:17:03 ] >>297 use List::MoreUtils qw(zip); $_ = '1,2,3'; push @result, {zip @{[qw(foo bar baz)]}, @{[split /,/, $_, 3]}};
303 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 16:23:58 ] >>299 おお! と思って List::MoreUtils の pairwise や mesh が使えるかと思って試してみました。 が、一旦変数に入れないとARRAYとして解釈してくれずダメでした… #NG print mesh qw(foo bar baz), (split(/,/, "1,2,3")); # compilation errors #OK my @array1 = qw(foo bar baz); my @array2 = split(/,/, "1,2,3"); print mesh @array1, @array2;
304 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 16:25:12 ] >>302 入れ違いになりました。 素晴らしい。使わせていただきます。ありがとうございます。
305 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 16:35:48 ] >>297 >(foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。 変数一つ作っていいならこんな関数かな my @arr = ('foo', 'bar', 'baz', 1, 2, 3); my $half = $#arr / 2; my @result = map { +($arr[$_], $arr[$_ + $half + 1]) } (0 .. $half);
306 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:07:39 ] >>302 いったん無名配列への参照[]にして それを@{}で、参照先の配列に戻して渡している という理解でいいのかな?
307 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:10:34 ] >>306 そだね ttp://perl-users.jp/articles/advent-calendar/2008/14.html
308 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:12:08 ] >>305 なんで3行で済ます方法を書いたの?
309 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:14:06 ] >>308 二行だろ
310 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:18:09 ] >>308 何揚げ足とろうとしてんのw
311 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:32:43 ] perl -e "print join',', map{(qw(foo bar baz))[$_],(split /,/, 'xxx,yyy,zzz')[$_]}(0..999);#十分に大きい値 foo,xxx,bar,yyy,baz,zzz >>300 よりはマシかなあ…
312 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:51:55 ] >>305 sub zip{ map { $_, shift @{$_[1]} } @{$_[0]} } print zip [1,2,3],[4,5,6] ;
313 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 18:02:25 ] perl -e '@array = qw/xxx yyy zzz 1 2 3/; print map { $array[$_] => $array[$_ + @array / 2] } (0..($#array / 2));'
314 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 21:28:38 ] >>293 ヒント:シノラー
315 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 22:52:02 ] TwitterのAPI叩くにはどうすればいいですか Net::Twitterとかじゃなくて、純粋にHTTP使ってその辺から学習したいのです
316 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 23:18:20 ] usy.jp/twitter/index.php?Twitter%20API#ga975f17 サンプル集
317 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 23:51:12 ] use Net::Twitter; 役にたたなかった
318 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 19:37:45 ] win32でパスを含めて 256 バイト以上のファイル www.namazu.org/ml/namazu-win32-users-ja/msg01951.html この問題ってもう解決されています?
319 名前:デフォルトの名無しさん [2010/05/11(火) 00:00:10 ] Perlのファイル読み込みと配列格納について質問があります。 エクセルから出力した行列状態になっているcvsファイルをPerlに読み込ませて、 @a、@b、@cにそれぞれの行のデータを格納したいです。 なので、二次元配列のようなことをしないといけないと思うのですが、 Perlで二次元配列のような処理をするにはどうすればよいのでしょうか? また行列状態になっているファイルを配列に格納する他の良い方法はありますでしょうか? よろしくお願いします。
320 名前:319 [2010/05/11(火) 00:14:07 ] 追記です。このような内容のファイルを扱っています。 1 Takehara Shinji 500 600 1300 2 Hatakeyama Takanori 569 795 1560 3 Kouki Kameda 785 889 2695 4 Daiki Kameda 758 784 9000 5 Tomoki Kameda 580 120 984 そして、左から4行目〜6行目にある数値を縦に、 @a、@b、@cに格納し、 $a[0] を参照すると、500 $a[1] を参照すると、569 $b[0] を参照すると、600 $b[1] を参照すると、795 $c[0] を参照すると、1300 $c[1] を参照すると、1560 といった具合にしたいです。
321 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 00:16:24 ] >>319 ・「perl 配列の配列」でググる ・「perl CSV」でググる
322 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 00:40:12 ] >>320 1 #! /usr/bin/perl 2 3 use strict; 4 5 my(@data, @array); 6 @data = ( 7 '1 Takehara Shinji 500 600 1300', 8 '2 Hatakeyama Takanori 569 795 1560', 9 '3 Kouki Kameda 785 889 2695', 10 '4 Daiki Kameda 758 784 9000', 11 '5 Tomoki Kameda 580 120 984', 12 ); 13 14 foreach(@data){ 15 push(@array, [@{[split(/\s+/, $_)]}[3..5]]); 16 } 17 18 local $\ = "\n"; 19 20 print $array[0][0]; #=> 500 21 print $array[1][0]; #=> 569 22 print $array[0][1]; #=> 600 23 print $array[1][1]; #=> 795 24 print $array[0][2]; #=> 1300 25 print $array[1][2]; #=> 1560
323 名前:デフォルトの名無しさん [2010/05/11(火) 01:17:33 ] >>322 ありがとうございます。 外部からファイルを読み込む場合はどうすればよいのでしょうか?
324 名前:321 mailto:sage [2010/05/11(火) 01:45:17 ] >>323 だから「perl CSV」でググれと教えたのに。ググれば ”csvファイルを読み込んで配列の配列に変換に変換する” ttp://d.hatena.ne.jp/perlcodesample/20080728/1217336230 こんくらいすぐに出てくるだろ
325 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 01:51:03 ] >>322 を改良できんレベルの人なら>>324 のリンク先飛んでもイミフだろ
326 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 01:53:57 ] >>323 use IO::File; my @data = IO::File->new('data.txt', 'r')->getlines; chomp @data;
327 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 02:04:22 ] use File::Slurp; my @csv = read_file('hoge.csv'); chomp @csv;
328 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 02:19:44 ] >>322 [@{[split(/\s+/, $_)]}[3..5]] は [(split /\s+/, $_)[3..5]] のほうがいいよね。この場合に限れば /\s+/, $_ が無くてもよし。 つーかCSVなら最初からText::CSV(_XS)?使えばいいじゃんって話だけど。
329 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 02:46:24 ] >>328 おお、/\s/まで省略できるのか 初めて知った ありがt
330 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 03:42:18 ] $_ = " foo\nbar\tbaz" としたとき、 split(/\s+/) だと ('', 'foo', 'bar', 'baz') が返るけど、 引数なしのsplit または split(" ") なら ('foo', 'bar', 'baz') になるってことだけ注意な。
331 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 01:12:21 ] HTTP通信するにはなんていうライブラリつかえばいいの
332 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 02:31:39 ] socks
333 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 13:31:19 ] えっ?
334 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 13:35:41 ] LWP
335 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 15:27:05 ] コードポイントからその文字を出力したいです。 #!/usr/bin/perl use strict; use utf8; use Encode; use Encode::Guess; my $cp = "4FAE"; # 「侮」のコードポイント my $packed = pack("S", $cp); my $decoded = decode("utf-16be", $packed); print $decoded, "\n"; my $decoded = decode("utf-16le", $packed); print $decoded, "\n"; できないです。
336 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 15:58:56 ] pack("U", 0x4FAE) じゃだめなのか
337 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 16:16:02 ] 0x4FAE または hex("4FAE") または "20398"
338 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 16:22:45 ] #!/usr/bin/perl use strict; use utf8; use Encode; use Encode::Guess; my $cp = "4FAE"; # 「侮」のコードポイント my $packed = pack("U", hex($cp)); print $packed, "\n"; ありがとうできました。でもwarningがでます。 $ perl cptest2.pl Wide character in print at cptest2.pl line 9. 侮 $
339 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 16:28:58 ] 16進文字列からバイト列への変換が間違ってるな。 pack("S", $cp)じゃなくてpack("H*", $cp)だろ。
340 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 16:32:44 ] >>338 wide characterをいきなりprintするとそうなる。 encodeしてバイト文字列にしてからprintするか、 printする前に文字コード指定してレイヤつけとけ。 binmode STDOUT, ':encoding(utf-8)';
341 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 16:34:59 ] binmodeつけたら直りました。 ありがとうです。
342 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 12:34:03 ] www.cgarbs.de/japana.en.html これをwindowsで動かせた人いますか? perlのファイル1つだけのプログラムだからlinuxで動かすのは簡単だったんだけど windowsではうまく動いてくれない
343 名前:デフォルトの名無しさん [2010/05/14(金) 13:21:02 ] 文字のバイトコードを得るほうほうを教えてください! たとえば、a から 97 を得るようなことってできますか??
344 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 13:23:28 ] ord("a")
345 名前:デフォルトの名無しさん [2010/05/14(金) 13:26:10 ] ありがとう!
346 名前:デフォルトの名無しさん [2010/05/15(土) 03:08:54 ] perlで文字をprint等で出力するとき、特定の行で改行をして出力するというようなことってできますか?
347 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 03:32:34 ] できるよ安心して
348 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 03:44:17 ] >>347 安心した やり方を教えてちょ
349 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 04:42:20 ] 何だよ「特定の行」って
350 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 06:11:15 ] 質問の意図するところが分からない。このうちのどれか? use strict; use warnings; print "is\nthis\nunko?\n"; use strict; use warnings; print << "END_OF_UNKO"; this is unko! END_OF_UNKO use strict; use warnings; use HTML::Template; my $what_is_this = join "", <DATA>; my $t = HTML::Template->new( scalarref => \$what_is_this ); $t->param('var', "was"); print $t->output; __DATA__ this <TMPL_VAR name="var"> unko!
351 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 06:50:15 ] >>348 use IO::File; my $fh = IO::File->new('hoge.txt', 'r'); while(my $line = $fh->getline){ print $line; print "\n" if $line =~ /hoge/; } こんな漢字?
352 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 09:22:29 ] $. == 行番号 とか。
353 名前:デフォルトの名無しさん [2010/05/15(土) 11:21:19 ] perlで作った掲示板の連続投稿を制限する方法を教えてください。 一定時間が経過するまで再投稿できないようにしたいです。
354 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 11:59:34 ] 投稿者のIDに対して最後の投稿時間を記録する
355 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 12:24:13 ] 小規模ならグローバルでもいいんじゃないの? # 30秒経過してない場合returnする return if $g_last_post + 30 > time; $g_last_post = time;
356 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 14:35:57 ] >>353 IPのログはとってんだろ? そこから判定すりゃいい samba24みたいな手にするって方法もあるな ちょっと技術がいるかも知れないが
357 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 14:55:21 ] 普通はそんなめんどいことしないでクッキー食わせて判定だと思うぜ
358 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 15:04:37 ] ログは巨大だからなあ 自前でテーブル持つ方が軽い
359 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 15:21:54 ] いやだから普通はクッキーだろっての
360 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 15:55:01 ] ↑バカは喋るな
361 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 15:58:24 ] >>359 クライアントが書き込み後にクッキー捨てたらアウトだと思うんだがそうでもないのか もうちょっと詳しく
362 名前:デフォルトの名無しさん [2010/05/15(土) 16:01:51 ] >>349-352 長いテキストがあり、100文字目ごとに改行を入れるということです。 分かりにくくて申し訳ありませんでした。
363 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 16:17:33 ] 2chもクッキーだな
364 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 16:27:54 ] >>362 Text::LineFold >>353 ,354-359,361,363 板違い pc11.2ch.net/php/
365 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 16:29:03 ] 一足遅かったか >>362 >>3 www.din.or.jp/~ohzaki/perl.htm#JP_Fold search.cpan.org/search?m=all&q=fold&n=100 >>353 △▲ WebProg 初心者の質問 Part22 ▼▽ pc11.2ch.net/test/read.cgi/php/1272872528/
366 名前:デフォルトの名無しさん [2010/05/16(日) 21:25:10 ] funcA(); if(hoge){ funcAErr(); } else { funcB(); if(fuga){ funcBErr(); } else { funcC(); if(fuga){ resultA(); } else{ resultB(); } } } こんな感じで事前処理にこけたら弾き、を繰り返して最後の処理で結果Aか結果Bのいずれかを返す、 と言ったコードがあるんですが、これをもっとPerlらしくシンプルに書きたいんだがどう書けばいいだろう……。 (ifネストが実際には3階層ではなく20階層くらいあります)
367 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 21:43:55 ] >>366 funcA() や funcB() の戻り値は無いのかとか、hoge や fuga が何を判定してるのかとか、 funcAErr() でなく funcErr('A') じゃダメなのかとか、エラー処理後に戻ってくる (if then else で括る) 必要があるのかとか、Perlらしさ以前の問題だと思う。
368 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 21:45:08 ] こんな感じの改造すれば良いんちゃう? my @tasks = ( sub { () }, # <= funcA() とかが入る。 sub { () }, sub { () }, sub { () }, sub { () }, sub { () }, sub { 42 } ); my $argument ; for ( @tasks ){ my $flag = $_->( $argument ) ; next if ! $flag ; # エラー処理やりたきゃ、ここを真面に。 print qq{${flag}hoge\n} ; last ; }
369 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 22:25:07 ] >>366 エラー処理はfuncA()、funcB()の中で例外発生させて 全体をevalブロックでくくり、例外をキャッチして処理 エラー以外の分岐は適当に処理をブロックでくくり、last、redoなどでコントロール eval { funcA(); funcB(); { funcC(); if (fuga) { resultA(); last } resultB(); } }; if ($err = $@) { $err->A ? funcAErr() : $err->B ? funcBErr() : $err->C ? funcCErr() : Err(); }
370 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 22:49:10 ] メールを受信して、添付の画像ファイルを画像処理し、サーバに保存したいと考えています。 メール受信時に本プログラムにメールを渡すようにメールサーバは設定しています。 以下ソースの関係している部分です。 ----mailimage.pl----- my $parser = MIME::Parser->new; #ファイルの一時保存場所を指定 $parser->output_dir('./tmp'); $filename=''; #標準入力からメールを取得 my $entity = $parser->parse(*STDIN); #添付ファイルがある場合のみ処理 if($entity->is_multipart){ #パートの数(本文と添付ファイルの合計数) $count = $entity->parts; #メール本文以外(添付のみ)を取り出し(本文は0番目のため、一番目から取り出し) for($i = 1; $i < $count; $i++){ #ファイル名を含むパスを取り出し $path = $entity->parts($i)->bodyhandle->path; #ファイル名を取り出し $filename =time. (fileparse($path))[0]; $filenameglobal=$filename; `./out1 $path outputimg/$filename.bmp`; } } out1というプログラムが画像処理を行うファイルで、第一引数に入力を、第2引数に出力先をとるように作成しています。 mailimage.pl < sample.eml といった具合に、ローカル環境でeメールファイルを渡してやった場合は正常に動作します。 しかし、実際にメールを受信するとtmpファイルへの保存は行われるのですがout1で得られるべき出力画像が得られません。 どうやら、tmpフォルダに保存される前にout1を呼び出しているようで、入力がない状態になってしまっているようです。 解決策のご提示をよろしくお願いいたします。 また、一度ファイルに保存することなく直接メモリ上で受け渡す方法などもご提示いただけると幸いです。
371 名前:デフォルトの名無しさん [2010/05/17(月) 01:35:34 ] perl から任意のアプリ(例えばメモ帳)を起動したいんだけどどう書けば良いのでしょうか?
372 名前:デフォルトの名無しさん mailto:sage [2010/05/17(月) 01:49:44 ] perl -e "`notepad`
373 名前:デフォルトの名無しさん [2010/05/17(月) 22:55:18 ] cpan> install XML::Atom *********いろいろ展開されて Please download the file manually, save it to a directory in %PATH% (e.g. C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to that directory, and run "Nmake15.exe" from there; that will create the 'nmake.exe' file needed by this module. You may then resume the installation process described in README. ------------------------------------------------------------------------------- Warning: No success on command[C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site] MIYAGAWA/XML-Atom-0.37.tar.gz C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site -- NOT OK Running make test Make had some problems, won't test Running make install Make had some problems, won't install Failed during this command: MIYAGAWA/XML-Atom-0.37.tar.gz : writemakefile NO 'C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site' ret urned status 512 cpan> と表示されてしまいました。とりあえず、nmake.exe はダウンロードしました。 これからどうすればいいでしょうか?
374 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 00:12:07 ] >>373 今使ってるperlをアンインストールしてActivePerlの最新版をインストールし、PPMを使え
375 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 00:23:08 ] うちcpanが成功した試しがないわ ppmならokだけど
376 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 05:28:00 ] XS系はことごとく失敗する気がする… 特にXMLやHTMLのパーサー関連は入らん at Ubuntu
377 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 06:13:44 ] まさかbuild-essential入れてないとかじゃないよな
378 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 06:45:12 ] XML-Atomはppmに無いからめんどくさいんだよな だから俺は使ってない あとこいつマルチだな
379 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 08:46:53 ] 今ならStrawberry Perl入れた方が楽じゃない? XML::Atomもすんなり入ったよ
380 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 08:55:06 ] そもそもwindows系OSでperl使うのがすでに茨の道とも言える
381 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 10:03:01 ] なんで?
382 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 11:48:53 ] >>378 リポジトリにこれ加えとけ。 trouchelle.com/ppm10/package.xml
383 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 12:20:10 ] elseifでなく何故elsifなんですか?
384 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 13:26:56 ] 母音が続くのが気持ち悪いから elifじゃないのと聞かれたら解答に窮するが、CPPはelifなんだよな 文化によって多少違いはあるが、やはり、母音が続くのが気持ち悪いんだと思う
385 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 13:55:38 ] いっそのことelfでいいじゃん。 短いし。
386 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 15:33:01 ] 最近プログラミングの勉強を始めました print "hello world"; と書いてhello.plで保存し、ターミナルで perl hello.pl と入力するのはわかったんですが、hello.plはどこに保存すればいいのですか? 環境はMac OS Xです
387 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 16:10:27 ] >>386 好きな場所
388 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 16:28:15 ] >>386 今自分がいる場所におけばいい 違う場所に置きたいならフルパスで指定すれば実行できる
389 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 16:41:23 ] >>382 サンクス つか、ppmguiにリポジトリのサジェストなんてあったんだな そこにも載ってたわ 重ねてサンクス
390 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 17:56:24 ] >>386 perlの前にターミナルの使い方を覚えるためのBash入門を読んだ方が良いかも。
391 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 18:42:40 ] それは的外れなアドバイス
392 名前:373 mailto:sage [2010/05/18(火) 21:37:27 ] ATOM::XML をWinXP/Active Perl に入れたい なにかヒントありますか? >>374 >>375 >>379 ストロベリー入れましたけど、Activeパールと同じエラーです。 (nmake をダウンロードして、ダウンしたパッケージをmake して、 それから、再度ACTIVE Perl で,ATOM::XMLしたときとです。 やはり、パッケージが問題なのかな? cpan> install ATOM::XML Fetching with LWP: cpan.strawberryperl.com/authors/01ma Fetching with LWP: cpan.strawberryperl.com/modules/02pa Fetching with LWP: cpan.strawberryperl.com/modules/03mo Creating database file ... Gathering information from index files ... Populating database tables ... Done! Warning: Cannot install ATOM::XML, don't kn Try the command i /ATOM::XML/ to find objects with matching identifiers.
393 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:44:02 ] 現在 WinXP上にActivePerlが入っています。StrawberrryPerlを入れて共存できるのでしょうか?
394 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:49:59 ] エラーメッセージくらい読めよ
395 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:52:02 ] 普通に考えるとパッケージ名ってAtom::XMLもしくはXML::Atomだからでは
396 名前:373 mailto:sage [2010/05/18(火) 21:57:06 ] とりあえず、 install XML::Atom::Feed とすると、したみたいになった。これってATOM::XML ってインストールできたのかな Prepending C:\strawberry\cpan\build\XML-Atom-0.37-H4btN8/blib/arch C:\strawberry \cpan\build\XML-Atom-0.37-H4btN8/blib/lib to PERL5LIB for 'install' Installing C:\strawberry\perl\site\lib\XML\Atom.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Base.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Category.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Client.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Content.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Entry.pm Installing C:\strawberry\perl\site\lib\XML\Atom\ErrorHandler.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Feed.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Link.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Person.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Server.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Thing.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Util.pm Appending installation info to C:\strawberry\perl\lib/perllocal.pod MIYAGAWA/XML-Atom-0.37.tar.gz C:\strawberry\c\bin\dmake.EXE install UNINST=1 -- OK cpan>
397 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 22:13:16 ] perlで添付ファイル取得して、それをopencvに渡して結果を保存したいんだが、出来ない。 ローカルでemlファイル読み込ませるといけるのに、メール受信をトリガに起動するとだめだ・・。 どうして?
398 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 22:32:58 ] >>396 OKってかいてありますやん 心配なら $ perldoc XML::Atom
399 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 22:34:23 ] >>396 XML::Atom と ATOM::XML は全く別のモジュールだ。 (存在すればの話しだが) お前さんが、いくら XML::Atom を入れたとしても、 ATOM::XML は永久に入らん。 気持悪いったらありゃしない。
400 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 12:22:56 ] アハハハ
401 名前:デフォルトの名無しさん [2010/05/19(水) 14:46:33 ] たとえば、[[:ascii:]]から'<'を除いた文字クラスを表わすにはどうしたらいいでしょうか?
402 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 18:51:09 ] もともと入ってないやん
403 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 21:53:00 ] 数百のファイルを処理するPerlスクリプトがありまして、それがシーケンシャルに処理してて クソ時間がかかるため、マルチスレッドでやらせようとPerlについて勉強しています。 で、いまんとこ、セマフォで並列処理数を制御し、joinするためだけのスレッドを動かして かたっぱしからjoinするようにしています。おかげで処理時間は半分以下になったのですが、 これを添削していただけないでしょうか。もっとエレガントなやり方があれば教えていただきたいです。 よろしくおねがいします。 #!/usr/bin/perl use strict; use File::Basename; use File::Path; use threads; use threads::shared; use Thread::Semaphore; use Codemap; use SVG; my $concurrency = 5; my $semaphore = Thread::Semaphore->new($concurrency); my $exitflag :shared = 0; my $jointhreads = threads->new(\&joinThreads); while (@ARGV) { my $orig_svg = shift(@ARGV); $semaphore->down; threads->new(\&doSplit, $semaphore, $orig_svg); } $exitflag = 1; $jointhreads->join; exit 0;
404 名前:403のつづき mailto:sage [2010/05/21(金) 21:53:56 ] sub joinThreads { until ($exitflag) { foreach my $thr (threads->list) { if ($thr->tid and !threads::equal($thr, threads->self)) { $thr->join; } } print "\nThreads joined.\n"; } } sub doSplit { my $semaphore = shift; my $orig_svg = shift; my $svg = new SVG($orig_svg); $svg->setdumpdir("work.d"); if ($svg->modtime() > $svg->splittime()) { $svg->dump(); print STDERR " $svg->{filename} : splitted\n" } else { print STDERR " $svg->{filename} : SKIP\n" } $semaphore->up; }
405 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 14:07:11 ] UTF8の〜をshift_jis(cp932)に変換して出力するとエラーが出てしまいます。 解決策があれば教えていただきたいです。 環境はWindows 7 64bitとActivePerl v5.10.1 64bitです。 use utf8; binmode STDOUT, ":encoding(cp932)"; print "昨日は10時〜6時まで寝た。\n"; D:\>test.pl "\x{301c}" does not map to cp932 at D:\test.pl line 3. 昨日は10時\x{301c}6時まで寝た。
406 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 14:20:39 ] D:\>test.pl 何故こんなところで作業しているのか
407 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 14:54:09 ] 「〜」には FULLWIDTH TILDE (FF5E) WAVE DASH (301C) の二種類がある。
408 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 14:57:40 ] 〜の厄介さはMacを使ってるとよく分かる
409 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:10:32 ] macでなくても〜は厄介
410 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:13:53 ] Macだとプログラムとか使わなくても 普段から〜が厄介になる
411 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:15:49 ] え? 俺は生粋のマカーだけど、厄介さが全然分からん。 何かトラブるっけ? "〜"って。 Mac<=>Winのデータ交換とかの話し?
412 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:21:41 ] Macで〜と書き込んだら Winだと逆向きの波線に見えたり 最近は大丈夫な気はするが
413 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:31:53 ] 〜が厄介なんて、OS9時代の話だろ。 昔から機種依存文字問題とか、今はUTF8-macとUTF-8とか もっと厄介なモンがあるから。
414 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:54:16 ] OSXでの話だが
415 名前:405 mailto:sage [2010/05/22(土) 17:06:03 ] 皆さんレスありがとうございます。 >>405 はmeadowから打ち込んだ〜は\x{301c}となり、 notepad等から打ち込んだ〜は\x{ff5e}になる事が原因で表示に失敗していました。 \x{301c}はshift_jisでは表示に成功しcp932では失敗しました。 \x{ff5e}はcp932では表示に成功しshift_jisでは失敗しました。 どうやらeucとsjisの〜はutf8の\x{301c}に対応していて cp932の〜はutf8の\x{ff5e}に対応しているようでした。 なので例えばeucの〜をutf8に変換し、それをcp932に変換すると失敗するようです。 挙動がおかしいと思った元のプログラムではネット上にあるeucのページを取ってきて utf8に変換し出力時にcp932に変換していたので上記の理由で文字化けしていた様です。 そこでeucをutf8に変換した際に\x{301c}を\x{ff5e}に変換するようにしました。 $utf8data =~ tr/\x{301c}/\x{ff5e}/; そうしたところprintした際に"\x{301c}" does not map to cp932というエラーも出ず、無事〜が表示されるようになりました。
416 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 17:10:30 ] 意味不明
417 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 19:23:59 ] >>405 use utf8は「フツーは使うな」とCPANに書いてあった気がする。 Windowsを呪いながらEncode使え。 #!perl use Encode; my $msg = "昨日は10時〜6時まで寝た。\n"; Encode::from_to($msg, 'utf8', 'cp932'); print $msg;
418 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 19:39:43 ] >use utf8は「フツーは使うな」 理由は?
419 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 20:34:20 ] >>417 >use utf8は「フツーは使うな」とCPANに書いてあった気がする。 どこに書いてあったの?聞いたことない
420 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 21:01:51 ] > Do not use this pragma for anything else than telling Perl that your script is written in UTF-8. もしかしてこれの事か?
421 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 21:08:00 ] >>417 そのEncodeの作者が >スクリプトはUTF-8で書き、use utf8;するのがモダンPerlのあり方です。 って言ってるけどな。 ttp://blog.livedoor.jp/dankogai/archives/51221731.html
422 名前:デフォルトの名無しさん [2010/05/22(土) 22:19:22 ] 文字列の切り取りに関して質問があります。 $a="aho"; $b="baka"; $str="ahomanukebaka"; $strには$aと$bで"manuke"という文字が挟まれています。 このとき$strからmanukeだけを切り抜くにはどうすればよいでしょうか?
423 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 22:24:54 ] substr($str, length($a), length($str)-length($a.$b));
424 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 22:48:06 ] >>422 my $a1 = "aho"; my $b1 = "baka"; my $str = "ahomanukebaka"; $str =~ s/$a1(.*)$b1/$a1$b1/; warn $str; # ahobaka warn $1; # manuke
425 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 23:01:54 ] 失敗してるのに前の$1を読んでしまう
426 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 23:16:31 ] >>425 あぁ、ごめん。本当はifとかやるけどmanukeが必要なのかどうなのかわからなくて とりあえず$1に入ってるよって言いたかった
427 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 23:22:02 ] >>424 できましたありがとうございます!
428 名前:417 mailto:sage [2010/05/23(日) 01:13:47 ] >>420 それだ。 WWW::Mechanizeでcp932受け付けんからEncode::decode_utf8($massage)とかやってたのに、 use utf8だけで済んだのか・・・・クソアホみたいだわorz
429 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 13:00:16 ] 正規表現のグルーピングについて質問です 繰り返し表れる対象をグループ化したいのですが良いやり方ありますか? gオプション付けたら行けるかと思ったらダメだった。 my $str = << 'END'; aba aca ada END $str =~ m{(a[^a]a)\n\n}g; # これだと初めの対象にしかマッチしない
430 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 13:23:18 ] >>429 g(global?)オプションだけでなく m(multi line?)オプションもいるんじゃなかったっけ
431 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 13:27:20 ] >>429 こう? my @matches = $str =~ m{(a[^a]a)\n\n}g;
432 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 13:32:54 ] >>430 $str =~ m{(a[^a]a)\n\n}mg; これも試したけどダメだったんだよね >>431 おぉ。いけました。 ちなみに=と=~を一緒に書くとわかりにくいので別にする方法ってありますか? 普通のマッチの場合、下みたいに分けたりしてるのだけどそういう方法があれば教えてください warn $1 if $str =~ m{(a[^a]a)\n\n}g;
433 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 13:41:44 ] >>432 ifをwhileに変えるだけ warn $1 while $str =~ m{(a[^a]a)\n\n}g;
434 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 13:59:57 ] gオプションが付いても付かなくても 正規表現に括弧がひとつしかないから、$2と$3は未定義。 ループを回すたびに$1の内容が変わる。
435 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 14:09:01 ] my @matches; push @matches, $1 while $str =~ m{(a[^a]a)\n\n}g;
436 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 14:25:05 ] while m//g とか while each %hash って気持ち悪いな
437 名前:429 mailto:sage [2010/05/23(日) 14:34:43 ] >>433-435 なるほど!ありがとうございます。while使うのかぁ。知らなかった。 perldoc perlreに書いてあるのかなぁって探してみたら書いてあった。勉強になりました。 @matches = ( 'foo' =~ m{ o? }xg ); or print "match: <$&>\n" while 'foo' =~ m{ o? }xg; せっかくなのでついでにもう一つ質問ですが、>>430 みたいにm付けた場合もやり方がありますか?
438 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 14:59:38 ] >>437 ないと思う mは^と$の意味が変わるだけだった気がする
439 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 15:51:17 ] なんか改行コードだけ特別扱いなんだよな
440 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:00:35 ] Perlのif文で質問があります。とあるデータ文書からPerlを使って情報を抜き出しているのですが、 情報1、情報2というのが存在して、情報1にヒットしたときは、情報1と情報2を出力、 情報1にヒットしないときは、無視というような判定をするにはどうすればよいのでしょうか?
441 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:09:09 ] perlに関係ないような気がするけど、こういう意味じゃないの? if (情報1にヒット) { print 情報1; print 情報2; }
442 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:12:57 ] >>441 データ文書の情報1と情報2が別々のところに記載されていてそれができないのです。 元データ文書を晒すので少々お待ちください。
443 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:24:18 ] 両方揃ってから判断するのだ
444 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:32:12 ] このデータ文書ファイルです。 uploader.moe.hm/cgi-bin/upload.cgi?mode=dl&file=2067 パス:perl 内容として作家情報と執筆した作品の情報が記載されています。 このファイルでは3名しか載っていませんが、実ファイルは世界中の作家情報が載っているので、 数万単位で同じような情報が載っています。 この中から、SCHOOLの行にUOFTOKYOと書いてある作家の作品だけを抜き出して出力できるようにしたいです。
445 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:35:10 ] DB_FileとかDBI使えばいいのに……Plain/textとはまた面倒な
446 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:53:34 ] >>444 schoolがuoftokyoの作家の名前を抜き出し、 その名前から違う場所にあるデータを抜き出して出力したいってこと? 大して>>441 とやること変わらない気がするな if (情報1にヒット) { 作家名から情報2を取得; print 情報1; print 情報2; } こうなるだけじゃない?
447 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:57:06 ] >>446 仰る通りです。 コードを書いているのですが、情報1にヒットした後、 情報2を書き出してやると、UOFTOKYO以外の作家作品情報も出力されてしまい、 どうしていいのか分からない状態です。
448 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 23:13:39 ] >>447 情報2のデータの取得方法がおかしいんじゃいの? そっちはどういうデータなの?
449 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 23:14:43 ] >>448 情報2はWORKSとENDの間の情報です。
450 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 23:33:20 ] 現在書いているコードも載せておきます。 uploader.moe.hm/cgi-bin/upload.cgi?mode=dl&file=2085 パス:perl
451 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 23:41:07 ] while (<IN>){ $line = $_; なんだこれ
452 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 23:48:02 ] ああー、そんなこと書いたこともあった
453 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:19:55 ] テキストファイルだと>>444 のようにやるのは無理なのでしょうか?
454 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:22:31 ] >>449 こんな感じかな。ネストがちょっと気持ち悪くてどうにかしたいけど codepad.org/I7NaSAPC >>450 にソース上がってたのね。見てなかったわ
455 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:37:05 ] 綺麗なコード書くなぁ 人の書いたコードは難しくて読めないことが多い俺にはちょうど良い読み易さだった
456 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:53:43 ] my $name ; while(<>){ $name = $_ if /^NAME/ ; next if ! ( /UOFTOKYO/ .. /^ID/ || eof ); print $name and undef $name if defined $name ; next if !(/^WORKS/ .. /^END/ ) ; print ; } 細かい所は知らん。
457 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:57:51 ] × /UOFTOKYO/ .. /^ID/ || eof ◯ /UOFTOKYO/ .. /^END/
458 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 01:01:27 ] >>456 おぉ。..ってそういう時も使えるのか。フラグ要らなかったな
459 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 02:00:33 ] へぇ、こんな使い方が出来るんだ。 30分位調べてようやく意味が理解出来た。 参考にした物 ttp://ja.wikibooks.org/wiki/Perl/%E6%BC%94%E7%AE%97%E5%AD%90#.E7.AF.84.E5.9B.B2.E6.BC.94.E7.AE.97.E5.AD.90 ttp://books.google.co.jp/books?id=BpdX333gbjkC&lpg=PR4&dq=oreilly%20%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%80%80perl&as_brr=3&pg=PA120#v=onepage&q&f=false
460 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 07:33:10 ] 正規表現に必ずxmsつける人ははじめて見たけど流行ってんの? 個々の意味はわかるけどこうしとくといい理由とかあるんだろうか??
461 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 07:38:13 ] >>460 Perlベストプラクティスに書いてあった癖で書いちゃう 普通は気にしなくていいと思う
462 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 10:06:39 ] >>461 気になるのでどういう理由でそう書いてあったか憶えてたら教えてください。 本屋に行くにせよ尼かなんかでポチるにせよ週末になっちゃうので待てないw
463 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 17:45:34 ] googleのアカウント持ってるなら、 ttp://books.google.co.jp/books?id=0dRPNtVvoqUC&printsec=frontcover&dq=perl+best+practice&as_brr=3&cd=2#v=onepage&q=正規表現&f=false で、255ページから読め
464 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 17:47:37 ] あ、URLエスケープ忘れてた。 ttp://books.google.co.jp/books?id=0dRPNtVvoqUC&printsec=frontcover&dq=perl+best+practice&as_brr=3&cd=2#v=onepage&q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE&f=false
465 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 19:06:38 ] これ全ページ無料で読めるんだね、すごい。 売上が下がるかもしれないのにオライリージャパンは許容してるの?
466 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 19:11:40 ] 多分許容してない>オライリー・ジャパン アメリカでは既に訴えられて裁判になり和解まで行ってるようだけど日本は分からん。 訴えられるまでやりますって感じかもね。 本は実際に手にとって読みたい人がいるからこれは良い宣伝になり売上が伸びる。 ってのもあるだろうけど、これだけで済ます人も多そうだ。
467 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 19:15:03 ] よく見るとわかるけどたまに表示されないページがあるよ。
468 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 19:15:18 ] って左下に「O'Reilly Japanの許可を受けてページを表示しています. 」って書いてあるじゃねーかw
469 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 22:51:55 ] 少なくともおれの場合は中身が見られることで洋書を買う量が増えたよ。 見るのはgoogleより米amaの方が多いけど。
470 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 23:12:24 ] おおー こんなのが只で読めるとは
471 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 23:34:58 ] レイアウト解説本に載ってるのって、俺からすると読みづらいことばっか書いてるんだ コメントが行区切りの役果たしてるんだから空白行いらんだろ、かえって関数が盾に間延びする よく考えたらほとんどの環境でPerlの場合コメント着色されないんだっけ・・・区切りの機能果たさないなw
472 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 23:51:08 ] これ買うかどうか迷ってたけど欲しくなったわ
473 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 00:52:16 ] >>467 たまにどころか途中から全部仏陀義理じゃねーかw
474 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 23:02:04 ] そうなのか まだ頭の方だからたまに飛ぶくらいでかなり役立ってる
475 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 13:48:27 ] Perlに匹敵するモジュールがそろった言語って他にありますか? 具体的には ・ActiveDirectoryの操作(Net::LDAP) ・FTPs ・WWW::Mechanize ・DBI ・Net::DNS ・GD ・関数のpack このくらいはせめて欲しいのですが・・・
476 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 14:06:24 ] 定番的なものはrubyにもpythonにも(そして多分schemeやHaskellにも)たいてい 相当するようなものはあるので好きなの使えばいいとおもうけど、そんなのは それぞれのスレに行って聞けよ。でもわざわざ他の言語使わんでもperlでいい んじゃね?
477 名前:475 mailto:sage [2010/05/26(水) 14:27:29 ] >>476 ありがとう。 Perlしか分からないので、Perlで書いたものを他に移植することで 勉強はじめようかと思いまして。 とりあえずスクリプト言語はPerlを嫁にして、 C/C++、Javaあたり覗いてきます。
478 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 17:00:41 ] usamimi.info/~pochi/perl/pochitate01.html にあるような感じで縦書きテキストビューワーを作っています。 引き数として与えられるファイルが、 テキストファイルなのかバイナリファイルなのか判定したいのですが、 -T でのテキストファイル判定はその判定方法から UTF-8以外の日本語文字コードでは上手く機能しないらしくて困ってしまいました。 テキストファイルかバイナリファイルかを判定する良い方法は無いでしょうか?
479 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 19:28:28 ] Encode::guessで判定して、decodeするときにFB_CROAKを指定して エラーにならなきゃOKとか?
480 名前:デフォルトの名無しさん [2010/05/26(水) 19:29:25 ] guess_encoding()使ってるみたいだから、guessに失敗したら中断(現行コードのまま)でえーんでないの? そもそも -T の精度も疑わしいし、ましてやWindows環境だとマジックナンバー照合による判定は無理なんでは? 判定精度を上げたいなら use Encode::Guess qw/euc-jp shiftjis iso-2022-jp/; ↓ use Encode::Guess qw/euc-jp shiftjis iso-2022-jp cp932/;
481 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 20:21:46 ] 全走査して\0が無ければテキストファイル。でもutf16/32は勘弁な。
482 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 21:11:04 ] >>478 テキストビューワなら、常にテキストと仮定しちゃえばいいんじゃないの?
483 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 21:55:51 ] >>482 まあ普通はそうだよなぁ 判定するようなエディタは少ない
484 名前:478 mailto:sage [2010/05/26(水) 23:48:34 ] >>479-483 レスありがとうございます。 guess しに行く前にどうにか判定出来ないかと 都合の良い事を考えていたのですけども、 >>482 さんや>>483 さんの仰るように常に対象はテキストファイルだと仮定して、 >>480 さんのご指摘の通り現行コードのままにする事にしましす。 >>480 cp932 の事をうっかり忘れていました。 寧ろ shiftjis より cp932 の方が重要なのに…。 ご指摘ありがとうございます。
485 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 09:17:39 ] shiftjisとcp932の両方を候補に入れるとほとんどの場合区別がつかなくて Encode::Guess->guessがエラー返すと思うのだが。 おおざっぱにいうとEncode::Guessの判定アルゴリズムは 1行ずつ候補のencodingでdecodeしていって、候補が1つになったら それを返す。候補がなくなったり複数残ったらエラー(ただしasciiが 最終候補に含まれていたらascii) だからね。
486 名前:478 mailto:sage [2010/05/27(木) 09:36:54 ] >>485 その通りなのです。 事実上、shiftjis よりも cp932 のテキストファイルを扱う方が圧倒的に多いと思って、 より現実に即して、判別候補の shiftjis を cp932 に変更しました。
487 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 09:49:56 ] どっちを扱うのが多いかより「〜」などのunicodeへのマッピングが異なる文字を どうしたいかの方が重要なきがする。
488 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 12:31:50 ] 俺も縦書きやったことあるけど unicodeに縦書き用のものがマッピングされてない約物({}…〜など)は 回転するしかなくて、そのなかでも波ダッシュは鬼門だったな。 ちなみに《》()「」『』【】〔〕の約物については縦書き用の文字が用意されてる。
489 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 14:39:56 ] 日本語フォントには縦書き用のグリフが含まれるからそれを使えばいいんだよ
490 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 19:23:42 ] EncodeでUTF-8にして扱うなら波ダッシュは全角チルダになっちゃうんじゃないの?
491 名前:デフォルトの名無しさん mailto:sage [2010/05/28(金) 10:03:55 ] >>490 いやそれはおかしい。
492 名前:デフォルトの名無しさん mailto:sage [2010/05/28(金) 19:01:24 ] 上の方に出てたけどeucとsjisの〜をutf-8に変換するとWAVE DASH (301C)になり cp932の〜をutf-8に変換するとFULLWIDTH TILDE (FF5E)になるみたいだね。
493 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 16:35:35 ] 20年前に少しかじったBasic言語しか知らないおらが、突然Perlを学ぶことに目覚めました。 たぶん初めてのPerlという良書のおかげです。 C言語とかJavaとかPythonとか色々学ぼうとして挫折を繰り返していました。 いきなりですが、質問があります。お教えください。 #!/usr/bin/perl print "Please enter a number \n"; chop($number=<STDIN>); while($number=~/|\D/){print "Please enter only a number! \n";chop($number=<STDIN>);} 以下数字が入力された場合に続く。 上記のように、何も入力されなかった(改行のみ)り、数字以外が入力されたときに エラーメッセージを出す方法を教えてください。 上記ではおそらくwhile($number=~/|\D/)の正規表現が間違っていると思います。 また、上記目的を叶えるためのエレガントな方法があればお教えください。
494 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 17:09:38 ] $number!~/^\d+$/ かねえ #!/usr/bin/perl print "Please enter a number \n"; while(1){ chop($number=<STDIN>); last if $number=~/^\d+$/; print STDERR "Please enter only a number! \n"; } とか…?
495 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 17:42:19 ] >>493 繰り返しループ処理のやりかたがわからないワケだな。 プログラミングの基礎が備わってないな。perl以前の問題。 フローチャートから勉強しなおしなさい。
496 名前:デフォルトの名無しさん [2010/05/31(月) 19:29:57 ] この時代にフローチャートかよw
497 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 19:34:20 ] オブジェクト指向とかカプセル化とか言っても訳わかんない気がする
498 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 20:08:51 ] >>494 ありがとうございます! 上手く動きました!! 空文字列のみを見つける正規表現があるのかと考えていましたが、 数字以外はダメという表記で良かったんですね。 ネットで探しても空文字列のみを見つける方法がよくわからなかったので悩んでいました。 >>497 自信を持って分かりますとは言えませんが、 サブルーチンなどで、プログラムの部品(パッケージ化とかカプセル化というのでしょうか)を 作って、プログラムを汎用性が高く、分かりやすく作ることかと理解しています。 初めてのPerlには、変数の扱いがCとは異なり、グローバル変数として扱われてしまう と書かれていたので、Perlはオブジェクト指向としては、少し扱いにくい言語ということ なんでしょうか?
499 名前:デフォルトの名無しさん [2010/05/31(月) 20:18:17 ] >>498 Perlはオブジェクト指向もサポートしている。 変数については、myを使えばローカルな変数になる。 my $hensu;
500 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 20:18:17 ] >>498 20点くらいだな、その理解は
501 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 20:47:35 ] >>495 ,500 こういうのが癌
502 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 21:07:18 ] 「いじめられる側にもいじめの原因がある」 「死刑には抑止力がある」 「何か言われて不快になったらその原因は発言者にある」 これまで当たり前だと思って、深く考えなかったこと・・・ 周りに言われるままに、何の疑問も抱かなかったこと・・・ それらが本当に正しいのか、ちょっと立ち止まって考えてみませんか 虐めに関するよくある勘違い jbbs.livedoor.jp/bbs/read.cgi/game/46573/1273655633/1-7 死刑制度に関するよくある勘違い jbbs.livedoor.jp/bbs/read.cgi/game/46573/1273498488/1-7 外界は内界を映し出す鏡だって言ってたよ裏庭の鶏も academy6.2ch.net/test/read.cgi/philo/1273156931/1-3
503 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 21:27:52 ] >>498 >空文字列のみを見つける正規表現 "\n"にもマッチしていいなら/^$/
504 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 21:43:52 ] >>498 が何版目の「初めてのPerl」を読んだのかが気になる。 まさか 1995年刊行の Perl4時代のソフトバンク版じゃあるまいな?
505 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 23:25:06 ] 手元の第三版にはchopは索引に載ってなかった。 chompの頁に「古いperlではchop演算子が使われていることがあります。」ってちょろっと書かれてるくらい。
506 名前:デフォルトの名無しさん [2010/05/31(月) 23:45:07 ] 誤解されそうなコメがあるから、おいらが補足。 ラクダ本第三版の索引にはchopは普通に載ってるし、それ以前にこんなの最新版Perlでちょろっと確認すれば済む話。 chopが何故か忌避されるのは、鋏の使い方を知らない馬鹿が多すぎたってことかな。 現在主流の馬鹿御用達言語PHPで、文字列末尾1文字を無条件に削除したい場合、使えねーsubstr()とか、preg_replace('/.$/u','',$hoge)とか使ってると、頭に蛆湧いてくるぜ。
507 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 00:08:25 ] おおー。ここ勉強になりますね! >>499 知りませんでした。 手元にあるPerl本は古本屋で買ったので 初めてのPerl 1995年6月16日 初版 Perlプログラミング1995年6月5日 第7版 でした。 >>500 後の80点はどの辺が足りないのかお教えください。 パッケージ化することで、グローバル変数が氾濫しプログラムが読みにくくなったり、 エラーが起きやすくなることを防ぐ。ということも(あっていれば)知っています。 >>503 正規表現面白いッス! while($answer!~/^\d+$/) while($answer=~/^$|\D/) この二つはほぼ同じと考えて良いんでしょうね! >>504 まさかの初版でした!! これからもよろしくお願いしマース! なにせ、読み始めたのが昨日からなんです。
508 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 00:09:28 ] 連続投稿すみません 自分の勉強のために 汚いコードでスレ汚しになりますが、Chap2の私の回答も載せますね。 #!/usr/bin/perl $pai=3.141592654; while($pronum!=5){ print "Chose program # (1-4 or to quit 5).\n"; chop($pronum=<STDIN>); if ($pronum==1){ $pro1result=12.5*2*$pai; print "The result is $pro1result \n";} elsif($pronum==2){ print 'Enter the radius'."\n"; chop( $radius=<stdin>);$radius *= $pai *2; print "The result is $radius\n";} elsif($pronum==3){print 'Plese enter 2 variables'."\n"; $first=<stdin>; $second=<stdin>; $first *=$second; print "The result is $first \n";} elsif($pronum==4){print "Please enter num and character \n"; chop($num=<stdin>);chop($char=<stdin>);$char=$char x $num; print "The result is $char \n";} elsif($pronum==5){print "Thank you for playing! \n";} else{ print "Try again!\n";} }
509 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 00:15:04 ] >>507 どうしても「初めてのPerl」を参考にして勉強したいというなら、 悪い事は言わないから第5版にした方が良い。 今、Perl4時代の本で勉強しても百害あって一利無しだと思うぞ? いくらなんでも時代遅れ過ぎる。 >>507 が使ってる Perl まで Perl4 というわでもあるまいに。
510 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 00:22:42 ] >>507 に必要なのは perldoc で perlintro を読む事
511 名前:507 mailto:sage [2010/06/01(火) 06:24:42 ] >>509 そうですか。うーん。 正規表現とか、考え方とかはそんなに変わらないかと思ったんですが、 有害なんですね。 できれば、オンラインで学習できるのが一番なんですが、まとまったサイトってありますか? >>510 ありがとうございます。 でも読むコマンドがわかりませんでした。 私は、Macなので、ターミナルを起動して >perldoc perlintroとコマンドを入力してみましたが、 perlintroというドキュメントはないというようなエラーが出ました。 No documentation found for "perlintro".
512 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 07:15:01 ] >>511 perldoc.perl.org/index-overview.html www.perldoc.jp/docs/perl/ >>2
513 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 08:34:09 ] >>511 サンプルコードによるPerl入門 d.hatena.ne.jp/perlcodesample/ 日本の Perl ユーザのためのハブサイト perl-users.jp/
514 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 14:55:03 ] qb5.2ch.net/test/read.cgi/saku2ch/1269144264/183 2010/04/01 21:55:59 HOST:softbank221101001151.bbtec.net qb5.2ch.net/test/read.cgi/sakud/1268731363/209 2010/04/13 22:40:00 HOST:softbank221101001151.bbtec.net qb5.2ch.net/test/read.cgi/sakukb/1267978152/196 2010/04/16 23:34:20 ID:GYnmPEAj0 qb5.2ch.net/test/read.cgi/sec2chd/1274948647/904 2010/05/30 16:54:09 ID:NuvDjPvV0 schiphol.2ch.net/test/read.cgi/stadium/1252943434/687 2010/04/01 22:00:01 ID:mB5AiSFL schiphol.2ch.net/test/read.cgi/tennis/1269837495/27 2010/04/01 22:01:15 ID:+EaxE3Yd schiphol.2ch.net/test/read.cgi/sports/1269560639/78 2010/04/13 22:44:20 ID:bew0Nrvf schiphol.2ch.net/test/read.cgi/sports/1268430764/294 2010/04/14 09:35:45 ID:hjGULPLG schiphol.2ch.net/test/read.cgi/war/1270527178/319 2010/04/14 18:23:30 ID:+lNQ2DXA schiphol.2ch.net/test/read.cgi/kyozin/1270206821/91 2010/04/14 18:29:06 ID:3CDN5Ccw0 schiphol.2ch.net/test/read.cgi/wres/1270861626/47 2010/04/14 18:30:38 ID:9IsRU2FN0 schiphol.2ch.net/test/read.cgi/ski/1268925479/573 2010/04/16 23:39:04 schiphol.2ch.net/test/read.cgi/goveract/1259841553/510 2010/04/18 17:31:32 ID:pk5WfpDm schiphol.2ch.net/test/read.cgi/gutter/1264177302/517 2010/04/18 17:34:51 ID:34DVdrjm schiphol.2ch.net/test/read.cgi/stadium/1251865219/707 2010/05/10 22:44:12 ID:hX93YGf3 schiphol.2ch.net/test/read.cgi/cancer/1268747646/273 2010/05/10 22:46:25 ID:nHvjUfwZ schiphol.2ch.net/test/read.cgi/sports/1260967753/636 2010/05/11 18:17:35 ID:yYc33zVj schiphol.2ch.net/test/read.cgi/war/1271752424/342 2010/05/16 18:50:43 ID:6cddBk0z schiphol.2ch.net/test/read.cgi/war/1243407044/217 2010/05/30 16:50:31 ID:2FL8NGA8 schiphol.2ch.net/test/read.cgi/equestrian/1231931323/760 2010/05/31 21:06:11 ID:34qn98Gz
515 名前:507 mailto:sage [2010/06/01(火) 22:30:15 ] >>512 >>513 丁寧にありがとうございます。 無事Perlintroを読み終えることができました。 まだデータ形式のハッシュはよく理解していませんが、少しずつ理解しようと思います。 サンプルコードによる・・には、新しい版用のコードの書き方の解説もあったので、 今持っている初めてのPerl本と見比べながら学びたいと思います。 ありがとうございました!
516 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 16:42:25 ] 2ちゃんねるにアクセスしたいんですがもうずっと人大杉となってしまいます。 回避する方法はありますか?
517 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 16:55:32 ] まず服を脱ぎます。
518 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 18:23:10 ] 脱ぎました。 次はどうすればいいですか?
519 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 18:50:55 ] >>518 口に鉛筆を咥える。
520 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 19:02:34 ] マジレスすると2chはUser-Agentがlibwww-perlとかだと弾くようになってる
521 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 11:05:28 ] 文字列をutf8からsjisに変換するのに、jcode を使用すると特定の文字が変換されずに?になってしまいます。('1〜5' → '1?5') 正しく変換するにはどのようにすればよいのでしょうか。 #!/usr/bin/perl use Jcode; my $utf = "1〜5"; my $sjis = jcode($utf)->sjis; my $euc = jcode($utf)->euc; print jcode($sjis)->utf8 . "/" . $utf . "/" . jcode($euc)->utf8;
522 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 11:28:59 ] >>521 すみません。自己解決しました。 use Jcode; を use Jcode::CP932; に変えるだけでした。
523 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 11:35:22 ] 昔の人がユニコードと既存の文字コードの対応関係を決めるときに 統一に失敗したので面倒なことになってます。ほんと迷惑。
524 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 11:02:37 ] Apache2+mod_perlやってるんですが、 その回のリクエストが終わっても残り続けるグローバルな変数って ありますか? メモリ上に残り続けるフラグを持ってリクエストのたびに処理を分岐したいです。
525 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 11:13:11 ] >>524 ファイルか、DBに残せばよいのでは?
526 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 11:40:52 ] アクセス数(マルチスレッド)が半端ないので ファイルはなるべく避けたいです。 フラグ一つのためにDB構築するのもなんか微妙なので。
527 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 11:51:05 ] IPC::ShareLiteとか使うのがいいんじゃね?
528 名前:デフォルトの名無しさん [2010/06/09(水) 11:53:33 ] printf "%.2f\n", 90.1730; printf "%.2f\n", 90.1740; printf "%.2f\n", 90.1750; printf "%.2f\n", 90.1760; printf "%.2f\n", 90.1770; printf "%.2f\n", 90.1630; printf "%.2f\n", 90.1640; printf "%.2f\n", 90.1650; printf "%.2f\n", 90.1660; printf "%.2f\n", 90.1670; この処理ですが、上の段は、5捨6入しているのですが、 下の段は4捨5入の処理をしています。 90.17 90.17 90.17 90.18 90.18 90.16 90.16 90.17 90.17 90.17 いろいろと試したのですが、printfがどういったルールで 丸めの処理をしているのかまったくわかりませんでした。 ググッてもこの処理の違いに関する説明もでてきません。 この処理の違いがわかる人はいませんか?
529 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 12:08:50 ] >>528 内部は2進数なので、2進数だと無限小数になっちゃう 数は有限桁数で表すと誤差が出るんだよな。 もう少し先の桁まで出すと % perl -e 'printf "%.20f\n", 90.1750;' 90.17499999999999715783 なので四捨五入だと切り捨ての方になっちゃうんだよね。
530 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 12:09:59 ] >>526 なら、WebPage側にhidden項目でも作って、そこに保存しておくとか・・・
531 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 12:22:41 ] mod_perlは使ったことないけどmod_speedycgiなら……
532 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 13:35:48 ] >>530 ?
533 名前:デフォルトの名無しさん [2010/06/09(水) 16:10:35 ] >>524 グローバル変数で変数を持たせるとセッションが続く限り、内部データは引き継がれる。 これはspeedycgiでも同じ。 普通は変数が引き継がれると困るので、局所変数で宣言するが、普通のcgiだと、cgiが 実行されるごとに、グローバル変数はリセットされるため、局所でもグローバルでもあま りあまり関係ない。そのため後からuse strict;で変数管理をしようとしてもエラーだらけで、 直しようがなくなる。
534 名前:デフォルトの名無しさん [2010/06/09(水) 22:41:24 ] use strict するとエラーが発生するCPANモジュールは登録しないで欲しい。
535 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 00:15:55 ] >>534 まさかstrictにrefs入れてないよね?
536 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 02:01:07 ] use stritc; しておいて必要なところだけブロック切って no strict 'refs'; だろjk
537 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 12:14:48 ] >>534 obsoleteなブツなんでないの? 同等以上の新しいモジュールがあるだろ。
538 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 17:21:59 ] test.txt文書内にある abc001.jpg abc002.jpg という2行の文字列を <Vol.001>abc001.jpg <Vol.002>abc002.jpg と書き換えてoutput.txtに書き出すPerlスクリプトを書きたいと思っています。 しかし、test.txt内の文字列が1行の場合には上手くいきますが、 例のような複数行では <Vol.001>abc001.jpg abc002.jpg となってしまいます。 どこが間違っているのでしょうか? #!/usr/bin/perl use strict; use warnings; $a="test.txt"; $b="output.txt"; open my $in , '<', $a or die "Cannot open '$a': $!"; open my $out, '>', $b or die "Cannot open '$b': $!"; while(<$in>){ s/abc(.+?)\.jpg/<Vol\.$1>abc$1\.jpg/; print $out $_; }; close($in); close($out);
539 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 17:55:00 ] そのままコピペしたけどちゃんと動いたぞ? あと関係ないけど、せっかくuse strictしてるんだから$a , $b はつかうな
540 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 20:11:20 ] 配列の宣言についての質問なんですが my @x=(1,2,3,4,5,6,7,8); my $y=100; my @pi =(@x/$y); この様に@で配列を制限し my @piの中身を1/100,2/100,3/100,4/100,・・・ として以下の計算につなげたいのですが、 どうしても上手くいきません・・・ foreach文なども試してみましたがダメでした 非常に低レベルの質問ですがどうかご教授よろしくお願いします
541 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 20:19:29 ] my @x=(1,2,3,4,5,6,7,8); my $y=100; my @pi; foreach my $tmp (@x){ push(@pi, $tmp/$y); } foreach my $tmp (@pi){ print "$tmp, "; }
542 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 21:06:34 ] key1, key2, ..., keyN, Value (N=10程度) のようなレコードを持ったCSVファイルに対して, keyA=AAAかつkeyB=BBBのレコードのValueの合計,平均,...etc といった統計を計算する最もスマートな方法を教えてください. レコード数は数十万〜数百万行を想定しています.
543 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 21:38:31 ] >>524 ourで宣言すればおk。 でも保持できるのはプロセス単位だから共有メモリ使った方がいいと思う。storableとか
544 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 22:03:32 ] >>540 perldoc.jp/docs/perl/5.12.1/perlfunc.pod#item_map_BLOCK_LIST_map my @pi = map $_ / $y, @x;
545 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 22:19:50 ] my @pi = map {$_ / 100} (1 .. 8); print "$_, " for (@pi);
546 名前:540 mailto:sage [2010/06/10(木) 23:13:47 ] >>541 、>>544 、>>545 わざわざ理解しやすい回答ありがとうございます 早速スプリクトに組み込んでみます
547 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 00:01:18 ] >>542 その数ならDBに突っ込んでSQLでやる
548 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 00:24:13 ] 合計と平均なら頭から読んで足したり数えたりするだけで いいと思うけど。
549 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 03:47:48 ] >>539 コメントありがとうございます。 問題点は、入力用ファイルの改行コードでした。 改行コードをUnixではなくMacの改行コードにしていたので、 2行が1行と認識されてしまっていたようです。 ずっと正規表現の問題だと思っていたので、コメントのおかげで別の観点で見直すことができました。 素人なのでもう一つ質問させてください。 >$a , $b はつかうな というのは、意味のない変数名を使うのではなく、 $infile,$outputfileなどのように一目で意味のわかる変数名を使いなさいということでしょうか?
550 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 03:51:22 ] >>549 $aと$bはsortの時に使われる。つか、use strictしてるのにmyなしで動いてる時点で「あれ?」ってなったでしょ? perldoc -f sort > global variables $a and $b
551 名前:507 mailto:sage [2010/06/11(金) 06:33:39 ] >>550 丁寧にありがとうございます。 色々調べてやっと仰っていることが理解できた気がします。 やはり、初めてのPerl初版本を読んでいた弊害がありそうです。 でもこのサンプルコードによるPerl入門は素晴らしいですね。 d.hatena.ne.jp/perlcodesample/20091120/1246679588
552 名前:デフォルトの名無しさん mailto:sage [2010/06/15(火) 18:38:48 ] 指定の処理を行いログを出力するプログラム hoge.plと そのログを読み込み解析し出力する analyst.plを作り、 普段はhoge.plを使いたまにanalyst.plを実行するという事をしてきました。 今回その解析済みログを利用するためにhoge.plの中でanalyst.plを実行させたくなったのですが require('analyst.pl');としたところ"\x{00cd}" does not map to cp932 at analyst.pl line 12. というエラーが大量に出ました。 これは両方のplファイルにuse utf8; binmode STDOUT ":encoding(cp932)";があり analyst.plでutf8からcp932に変換されたものがhoge.plでさらにcp932に変換されているからのようで analyst.pl内のbinmode〜;をコメントアウトするとうまく動くようになりました。 しかしanalyst.plの単独実行時にうまく動かなくなりました。 このような場合どうすれば両立させることができるのでしょうか?お知恵を貸して欲しいです。 This is perl, v5.10.1 built for MSWin32-x64-multi-thread
553 名前:デフォルトの名無しさん mailto:sage [2010/06/15(火) 19:01:09 ] >>552 ちょっと面倒だけど新たにAnalyst.pmを作成し、そこにanalyst.plの機能を全部放り込んだサブルーチンを作り、 hoge.plとanalyst.plはそれを読み込み実行すれば両立出来るよ。 hoge.plとanalyst.plの二つのファイルだけでは・・・できるのかな?
554 名前:デフォルトの名無しさん mailto:sage [2010/06/15(火) 20:02:21 ] >>553 そこまでするならモジュール化すればいいだろw
555 名前:デフォルトの名無しさん mailto:sage [2010/06/15(火) 20:06:22 ] 試してないけど ':raw :encoding(cp932)' みたいにレイヤー重ねがけすればとりあえず動くんじゃね
556 名前:デフォルトの名無しさん mailto:sage [2010/06/15(火) 20:43:23 ] >>552 requireする前にbinmode STDOUT=>":raw"; あるいはanalyst.pl内のbinmode文をbinmode STDOUT=>":raw:encoding(cp932)";
557 名前:552 mailto:sage [2010/06/15(火) 21:25:50 ] なるほど、:rawを重ねると生データにリセットできるんですね。 requireする前に一行追加することで簡単に実現出来ました。 呼び出し前に:rawにして呼び出し先で:cp932に再セットされるという流れもなんだか良いです。 >>553-556 みなさんレスありがとうございました。
558 名前:552 mailto:sage [2010/06/15(火) 21:54:21 ] このスレ雰囲気良いね
559 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 03:43:58 ] 一気に雰囲気が悪くなった
560 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 05:22:30 ] そんなこというなよ…
561 名前:デフォルトの名無しさん [2010/06/16(水) 17:53:09 ] perlスクリプトファイルのコメント部分だけ取得する良い方法はないでしょうか? 単純に # より前を消すみたいのを自分で作ってたんですが、print '#'; とか、s#a#b#; というのも考えられるなとか、ヒアドキュメント中の # はどうするとか、、、 私の脳みそでは確実に無理なので、なにかないでしょうか?
562 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 19:11:59 ] つ正規表現
563 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 19:59:14 ] m{ hoge # not comment } と m{ hoge # comment }x の区別とか想像しただけで嫌になるよなw
564 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 20:23:53 ] >>561 perltidyとかは?
565 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 20:30:46 ] $_ = '1"##"#a"'; print qq#\# match #, '#', "\n" if /"#a/ && m#[^\#]\##; # こめんと; { #" ですよ} 考えてみようとして例を作っただけでつらくなってきた
566 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 20:42:23 ] PPIとか使ってみれば? 正規表現の中のコメントは対応 できてないみたいだけど、他は結構いけるようだよ。
567 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 23:08:27 ] 正規表現のxオプション使ってる?
568 名前:デフォルトの名無しさん mailto:sage [2010/06/17(木) 00:40:40 ] >>561 Text::Balanced とかは?
569 名前:デフォルトの名無しさん mailto:sage [2010/06/17(木) 03:22:58 ] とりあえず#の後に;がない行を抜き出してみて、それでどれくらい引っかかるか見てみれば? 厳密にやろうと思えば何らかのPerlパーサを使わないと、正規表現でちょいちょいやるっていうのは無理だろうな。
570 名前:561 [2010/06/17(木) 10:33:00 ] >>562-569 ありがとうございます。なかなか難しいんですね・・。 気づいたのですが、秀丸とか(ほぼ)ちゃんとコメント色分け出来てますよね。 やっぱり偉大なソフトですね・・。
571 名前:デフォルトの名無しさん mailto:sage [2010/06/17(木) 11:57:22 ] どの辺までフォローしてるのかしらんけど Regexp::Common::commentとか