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 あたり
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 ありがとうございます、繰り返し演算子という奴を使うんですね。