1 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 03:03:00 ] "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 ● 2009/08/07 現在の最新版: 5.10.0 ▼ 前スレ Perlについての質問箱 40箱目 pc12.2ch.net/test/read.cgi/tech/1243631674/ リンク集は >>2-3 Perl 日本語処理の基礎の基礎 >>4 過去スレは >>5-6 あたり
152 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 13:32:03 ] >>151 配列スライスでできそうに思っていたけど、思いつかなかったんだ。 ありがとう。 頭が錆びてきているのかな。。。
153 名前:デフォルトの名無しさん [2009/08/23(日) 19:12:47 ] てす
154 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 11:30:57 ] これって、シンボリックリファレンスみたいな感じですけど、use strictで通るってことは違うんですかね? use strict; my $func_name = 'plus'; print Foo->$func_name(1, 2); #=> 3 package Foo; sub plus { shift; $_[0] + $_[1] }
155 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 12:24:55 ] Perlにはサブルーチンの数に制限がありますか? というのも、requireでいくつかのサブスクリプトに分散してサブルーチンを作っているんですが、 サブルーチンへの分岐がスルーされるという現象に見舞われています。 ところが、requireの記述の順序を変えるとこれがスルーされなくなる代わりに、それまで処理され ていた別のサブルーチンが処理されなくなるという具合です。 さらに、処理が行われないサブルーチンを含むスクリプト定義をコメントアウトし、メインルーチンでは 処理が行われないサブルーチンへの分岐をそのままにした状態で実行してもエラーにならないのです。 個々のサブルーチンについては、特にエラーは出ないのですが…
156 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 12:48:03 ] ↑ 補足です。requireはメインルーチン文頭に条件分岐なしで記述してあります。
157 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:05:39 ] >>155 >Perlにはサブルーチンの数に制限がありますか? Perlよくしらないけど、ないんじゃないかなあ。 問題は別のことが原因だとおもう。たとえばサブスクリプトで同じ名前の関数を 定義しているために、読み込む順番によって上書きされたりしなかったりとか。
158 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:16:20 ] >>154 fireball.loafer.jp/kes/perl/article_134.html
159 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:34:53 ] 手さぐりしてないで、有効なサブルーチンをリストしてみれ。
160 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:51:20 ] >>158 アロー演算子の後のスカラー変数は動的なメソッド呼び出しをするという機能なんだ。 賢くなった。 d
161 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 15:53:12 ] >>157 まさにその通りでした…(恥)orz
162 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 15:54:32 ] 申し遅れました、>>157 さん・>>159 さん、ありがとうございましたm(_ _)m
163 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 12:05:48 ] なぜハッシュリファレンスへのアクセスで、従来と似たような$href{one}としないで、 $href<one>と山括弧にしたのですか? 404 Blog Not Found:perl - $@%&*のよしあし blog.livedoor.jp/dankogai/archives/50772506.html
164 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 23:50:15 ] Test::Simpleのインストールで下記のエラーが発生するのですが、解決方法ないでしょうか? 過去のVersion0.90〜0.82も試しましたが結果は同じでした。 ・Windows XP Professional SP3 ・CYGWIN_NT-5.1 hostname 1.5.12(0.116/4/2) 2004-11-10 08:34 i686 unknown unknown Cygwin ・This is perl, v5.8.5 built for cygwin-thread-multi-64int ・$ perl -MCPAN -e 'print $CPAN::VERSION;' 1.9402 t/Builder/try...........................NOK 6 # Failed test at t/Builder/try.t line 36. # got: # expected: 23 t/Builder/try...........................ok 8/0# Looks like you failed 1 test of 8. t/Builder/try...........................dubious Test returned status 1 (wstat 256, 0x100) DIED. FAILED test 6 Failed 1/8 tests, 87.50% okay 全文 ttp://textup.no.land.to/w/1251470681/
165 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 00:23:40 ] use utf8; use Encode; open(FH,'c:\hoge.txt'); binmode(FH,':utf8'); my $x = <FH>; $x =~ s/ア//g; print encode('utf8',$x); close(FH); hoge.txt(utf8で記述されている)から一行抜き出して、その文から「ア」を削除したいんですけど、 こんな感じのソースを書いてみたら案の定期待した通りには動きませんでした。 どうすれば期待通りの挙動になってくれるんでしょうか、誰か教えてください
166 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 00:51:28 ] >>4 を読め
167 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 08:57:56 ] >>164 1. t/以下を読んで原因を探って解決。 2. バギーでも少々動けばいいやと思うなら cpan -if Test::Simple。
168 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 13:02:19 ] >>166 >>4 は読んでますけど関係無いですよね? Dos窓はきちんとutf8で動かしてるし、単純にutf8なソースの中で正規表現を使う方法だけ知りたいんです。
169 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 13:45:53 ] 読みかたが足らん。100回読め。>>4 を100回読め! 自分のコードと、どこがどう違うか 1行1行しっかり吟味しろ
170 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 17:46:46 ] 変数のことでお聞きします --------------------- a = 0 処理 a = a++ --------------------- 上記のようにa++を使うような感じで 数字+アルファベット+特殊記号のアンダーバー_ 37文字を100万値まで繰り返し使いたいです 変数aの次にb bの次はc・・・・ zの次は0 0の次は1・・・ 9の次は_ _の次はa aの次はb a〜z 0〜9 _ これを繰り返す方法教えてください 37進数って言うのかな?
171 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 17:53:09 ] ちょっと違うけど。 my @ary = ('a'..'z', '0'..'9', '_'); my $len = scalar @ary; for my $i (0..100) { print $ary[$i % $len]; }
172 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 17:57:40 ] >>171 配列に37文字組み込んでってことですね 大変参考になりました 即レス頂きありがとうございました!
173 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 20:27:12 ] どうでもいいけど、プロは a = a++ なんてコードは書かない
174 名前:デフォルトの名無しさん mailto:sage [2009/08/30(日) 01:08:32 ] >>170 まだ初心者だけど、>>171 を参考に作ってみた。 package Base37; use strict; use warnings; use Carp; use overload ( '++' => \&inc, '--' => \&dec, '+' => \&plus, '-' => \&minus, '=' => \©, '""' => \&str, ); my @base = ('0'..'9', 'a'..'z', '_'); sub new { my $class = shift; my $symbol = shift || $base[0]; my $pos = index( (join q{}, @base), $symbol ); croak "`$symbol' can't be used. `@base' are available." if $pos < 0; bless {pos => $pos}, $class; }
175 名前:デフォルトの名無しさん mailto:sage [2009/08/30(日) 01:09:31 ] 続き sub inc { my $self = shift; $self->{pos}++; $self->{pos} %= @base; Base37->new( $base[$self->{pos}] ); } sub dec { my $self = shift; $self->{pos}--; $self->{pos} %= @base; Base37->new( $base[$self->{pos}] ); } sub plus { my ($self, $other) = @_; if (ref $other ne 'Base47' ) { $other = Base37->new($other); } my $pos = ( $self->{pos} + $other->{pos} ) % @base; Base37->new( $base[$pos] ); }
176 名前:デフォルトの名無しさん mailto:sage [2009/08/30(日) 01:10:45 ] 続き sub minus { my ($self, $other, $is_reversed) = @_; my $pos; if (ref $other ne 'Base47' ) { $other = Base37->new($other); } if ( $is_reversed ) { $pos = $other->{pos} - $self->{pos}; } else { $pos = $self->{pos} - $other->{pos}; } $pos %= @base; Base37->new( $base[$pos] ); } sub copy { Base37->new( $base[shift->{pos}] ) } sub str { $base[shift->{pos}] } package main; my $a = Base37->new('z'); $a++; print "$a\n"; #=> _ $a++; print "$a\n"; #=> 0
177 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 04:22:41 ] どうでもいいけど、プロは$aと$bにmyは付けないw
178 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 05:30:03 ] お前の発言の方がどーでもいいわw ざっと探してみたけどperlじゃ36進数のサンプルないぞ さすがにCとVBはあったけど で、37進数やろ お前が37進数やってみればいいやろプロさんwww
179 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 06:42:37 ] $aが特殊変数である事実が、どうでも良い取り扱いな訳ないだろ。
180 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 12:09:26 ] $a <=> $b と書いて、しまったソートが逆だった、という時に、 最小の労力で逆転させるにはどうすれば
181 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 12:37:25 ] 下記サイトにある、 \*import = cgi_fixup(); って何をしているのです? そもそも、\*import ってのが何を表しているのかがさっぱりわからん。 blog.livedoor.jp/dankogai/archives/50805754.html
182 名前: ◆TWARamEjuA mailto:sage [2009/08/30(日) 13:59:59 BE:3812257-BRZ(10101)] >>180 reverse
183 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 14:15:03 ] reverseってコンパイラ的には読む方向を変えてるだけなんだろうか
184 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 17:44:31 ] 別スレにある下のプログラムが動かないんだけどこれだけだとだめなの?ちなみに環境はアクティブパールの最新版 use bigint; $SEED=0; for $sec (0..0xffff){ $SEED=$sec; $mapSEED=&dq9_rand;&dq9_rand;$rand=&dq9_rand; $loc1=&loc($rand,47); $loc2=&loc($rand,131); $loc3=&loc($rand,150); printf "$sec秒:SEED=%04X 場所(%X,%X,%X)\n",$mapSEED,$loc1,$loc2,$loc3; } sub dq9_rand{ $SEED = ($SEED * 1103515245 + 12345) & 0xffffffff; $ret =($SEED >> 0x10 & 32767); return $ret; } sub loc{ $r=shift; $upper=shift; $diff_1=$upper; # 差分+1 = $upper-下限1+1 return ( 1 + ($r % $diff_1 ) ); }
185 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 17:53:17 ] >>184 なんかこんなの出てきたぞ。意味わからんけど動いてるんじゃね 0秒:SEED=0000 場所(19,21,59) 1秒:SEED=41C6 場所(9,1B,40) : 中略 : 65535秒:SEED=0CA6 場所(18,79,36)
186 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 19:22:46 ] Unrecognized character \x81ってエラーが出ていたら笑ってやる
187 名前:デフォルトの名無しさん mailto:sage [2009/08/30(日) 23:11:59 ] >>186 ごめん、その通りなんだ 初めていじるので全く意味がわからない・・・
188 名前:デフォルトの名無しさん mailto:sage [2009/08/30(日) 23:30:43 ] 出たことあるなあ 漢字についての取り扱いでよそからコピペした時だったので、 しばらく悩んだ
189 名前:187 mailto:sage [2009/08/31(月) 00:00:57 ] 自己解決しました
190 名前:デフォルトの名無しさん mailto:sage [2009/08/31(月) 22:24:36 ] perl初めたばかりだけど 基礎らしい二分検索のプログラム書こうとチャレンジしてるんだが方法が思いつかない。 ソート済の対象ファイルを配列に取り込んで、配列個数調べて 個数nの半分の値の所で比較して比較して……って感じで流れは分かるんだけど 一応検索で該当箇所見つけ出してそこに1行突っ込む、って部分は出来たんだけど……
191 名前:デフォルトの名無しさん mailto:sage [2009/08/31(月) 22:26:48 ] 二分検索のアルゴリズムが理解できてないのか? perlの文法がわからなくてプログラムコード化できないのか?
192 名前:デフォルトの名無しさん mailto:sage [2009/08/31(月) 22:35:57 ] (3,4,5)みたいな行列が与えられたときに 0,0,0 0,0,1 0,0,2 0,1,0 0,1,1 0,1,2 0,2,0 . . . みたいな3×4×5=60個の組み合わせを全部表示するようなプログラムを作りたい。 forループ3回まわせばそりゃ楽なんだが、再帰でやってみようとしてもどうも うまくいかない・・・。どんな風に書けばいいかな?
193 名前:デフォルトの名無しさん [2009/08/31(月) 22:44:24 ] >>191 二分探索は ソートされているデータを、まず要素の真ん中で検索し、比較対象が上か下か調べる それを更に上と下で区切ったほうのさらに真ん中で同様の処理 繰り返し最後の値が見つけ出すまでやる・・・・で良かったかな 配列取り込んで、配列の数出して、 それを1/2してまではなんとかなるけど、 そこから先、どのように書いたらいいかが見当付かないんです・・・・
194 名前:デフォルトの名無しさん mailto:sage [2009/08/31(月) 23:47:12 ] >>192 これでどうだ sub foo { my ($n, @rest) = @_; return map { my $i = $_; @rest ? map { "$i, $_" } foo(@rest) : "$i\n" } (0 .. $n-1); } print foo(3, 4, 5);
195 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 01:10:58 ] >>193 そこまで分かってるなら、あとはコーディングするだけじゃん。 perlの文法がわからないの? だったら入門書や解説サイトを読めばいいやん。
196 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 01:47:37 ] >>195 if関数で ひたすら大か小かで判定するかしか思い浮かばなくて…… whichでその大か小かの判定だけさせた無限ループにして 一致した時点でlastで抜ける みたいな感じでいいのでしょうか……
197 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 01:52:53 ] 思い浮かんだなら形にしてみ
198 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 01:59:35 ] >>196 バイナリ検索は、配列を切ったりはったりせずに、インデクスの上下でせめていくといいよ とりあえず再帰を使った例を出しとく。でも普通は効率化のため再帰じゃなくループにする sub search { my ($arr, $data, $min, $max) = @_; return (0, $min) if ($min >= $max); # サーチ失敗フラグ+挿入すべきインデクス my $i = int(($min + $max) / 2); return search($arr, $data, $min, $i) if ($arr->[$i] > $data); return search($arr, $data, $i+1, $max) if ($arr->[$i] < $data); return (1, $i); # サーチ成功フラグ+見つかったインデクス } my @array = grep { $_ % 3 } (1 .. 10000); # テスト用:3の倍数を除く10000以下の自然数 foreach my $data (0, 100, 3000, 7777, 10001) # この5つの数を検索してみる { my ($found, $index) = search(\@array, $data, 0, scalar(@array)); if ($found) { print "$data を発見しました(位置=$index)\n"; } if (!$found) { print "$data はありません(挿入すべき位置=$index)\n"; } }
199 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 23:24:28 ] 下記サイトに記載されている関数は何をする関数でしょうか? Perl Internalsについて - Unknown::Programming d.hatena.ne.jp/fbis/20080627/1214537750 Internals::HvREHASH Internals::SvREADONLY・・・これはわかった Internals::SvREFCNT・・・これもわかった Internals::hash_seed Internals::hv_clear_placeholders Internals::rehash_seed
200 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 09:52:55 ] >>199 hash_seedはハッシュDBの構造が理解できれば何のことかすぐわかるはず。
201 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 22:07:37 ] ハッシュの配列について質問があります 例えば、 my %hogehoge; foreach(0..10){ push(@{$hogehoge{pos}},[$_,$_+1]); } されたものがある場合、どうやって$hogehoge{pos}を表示すればいいのでしょうか?
202 名前:デフォルトの名無しさん [2009/09/02(水) 22:37:25 ] こうするか foreach (@{$hogehoge{pos}}){ print $_; } あるいは $hogehoge{pos}->[0]; # 連番で
203 名前:デフォルトの名無しさん [2009/09/02(水) 23:29:50 ] >>202 それだと、こうなってしまうのですが・・・ ARRAY(0x1004f668)ARRAY(0x1004f830)ARRAY(0x1004f890)ARRAY(0x1004f8f0)ARRAY(0x1004 f950)ARRAY(0x1004f9b0)ARRAY(0x1004fa10)ARRAY(0x1004fa70)ARRAY(0x1004fad0)ARRAY(0 x1004fb30)ARRAY(0x1004fb90)
204 名前:デフォルトの名無しさん [2009/09/03(木) 01:45:42 ] >>203 そりゃ、そのまま吐いたらそうなるなぁw こうかな。 for my $pos_ref (@{$hogehoge{pos}}) { warn $pos_ref->[0]; warn $pos_ref->[1]; } そもそもその前にpushしてるのが直感的な感じしないからこうしちゃうなぁ my @array = map { [$_, $_+1] } (0..10); $hogehoge{pos} = \@array; で、>>202 が言ってるみたいに->[0]でやるかなぁ
205 名前:デフォルトの名無しさん [2009/09/04(金) 09:53:49 ] >>202 print "@$_" for @{$hogehoge{pos}};
206 名前:デフォルトの名無しさん [2009/09/04(金) 10:00:28 ] my %hogehoge = map [ $_, $_+1 ], 0..10; }
207 名前:デフォルトの名無しさん mailto:sage [2009/09/04(金) 10:14:27 ] >>201 デバッグで値を見たいとかではなくて? my %hogehoge; foreach(0..10){ push(@{$hogehoge{pos}},[$_,$_+1]); } use Data::Dumper; use Dumpvalue; print Dumper($hogehoge{pos}); Dumpvalue->new->dumpValue($hogehoge{pos});
208 名前:デフォルトの名無しさん [2009/09/04(金) 16:00:18 ] Param::Validateモジュールの使い方を日本語で解り易く解説しているWebサイトを教えてください。 CPANに上がってる英文マニュアル見たがさっぱり、自動翻訳してもっとわけわかめになった。
209 名前:デフォルトの名無しさん mailto:sage [2009/09/04(金) 21:06:08 ] YES → 【ヒットした?】 ─ YES → なら聞くなよ。氏ね。 / \ 【検索した?】 NO → なら、ねぇよ。氏ね。 \ NO → 氏ね。
210 名前:デフォルトの名無しさん [2009/09/05(土) 20:42:45 ] Perl素人のオレに教えてくれ。いや、ください 初心者サイトとかを回りながら、ファイルを読み込んで表示するだけのcgiを作ろうとしたんだけど ファイルを二個読み込もうとするとインターナルサーバエラーとか言われる IO::FILE使わなければ問題なく動くんだけどなぜなの? IO::FILEは二回呼び出せないの?
211 名前:デフォルトの名無しさん [2009/09/05(土) 20:43:27 ] 以下作ってみたコード #! /usr/bin/perl use CGI; use IO::File; $logfile = 'data.log'; # ログファイルの名前 $logfile_02 = 'data_02.log'; # ログファイルの名前 $all_data = read_all_data(\$logfile); $all_data_02 = read_all_data(\$logfile_02); $q = new CGI; print $q -> header(-Charset=>'sjis'); print $q -> start_html(-title => "test"); print @$all_data; print @$all_data_02; exit; sub read_all_data{ my $logfile = shift; my $io = IO::File->new($$logfile, 'r'); my @lines = $io->getlines; $io->close; return \@lines; }
212 名前:デフォルトの名無しさん [2009/09/06(日) 01:09:29 ] > my $io = IO::File->new($$logfile, 'r'); $$って
213 名前:デフォルトの名無しさん [2009/09/06(日) 02:37:24 ] >>212 できた! ありがとん でもなぜ$$logfileじゃだめなんだぜ? my $logfile = shift; にファイル名へのリファレンス格納→$$logfileでデリファレンスっていう流れだと思ったのに…… 何か根本的に間違ってんのかな
214 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 06:36:13 ] Perlでは文字列と数値は同じような扱いをしますが、Dumpすると内部的には 区別されてますよね? 数値なのか文字列なのかをプログラム内で判断する方法ってあるんですかね? 困っているわけではなく、単なる興味本位なのですが。 use Devel::Peek; $num = 0; $str = '0'; Dump $num; Dump $str; ____________________________________________________ SV = IV(0x1828220) at 0x287dac REFCNT = 1 FLAGS = (IOK,pIOK) IV = 0 SV = PV(0x289e34) at 0x183271c REFCNT = 1 FLAGS = (POK,pPOK) PV = 0x285144 "0"\0 CUR = 1 LEN = 4
215 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 07:10:02 ] >>214 気にしたこと無かったけどぐぐったら見つけた oshiete1.goo.ne.jp/qa1737534.html こんなやり方あるんだねー
216 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 07:50:08 ] >>214 Devel::Peekができてるんだから出来るんだろうよ。 ソース読んでみ。 ちなみにこの挙動については友人と議論したことがあるが、 数値か文字列か区別できたところで使いどころがない。 そもそも仕様外だから危なっかしくて使えねー。 ちなみに数値にしたけりゃ +0すりゃいいし、文字列にしたけりゃ .''すりゃいい。
217 名前:デフォルトの名無しさん [2009/09/06(日) 08:09:31 ] >>213 > でもなぜ$$logfileじゃだめなんだぜ? デリファレンス
218 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 08:16:46 ] >>215 ちょっと違うような。。。 >>216 Devel::PeekはXSで書かれているんで自分にはよくわからんです。
219 名前:デフォルトの名無しさん [2009/09/06(日) 08:18:20 ] >>214 おすすめはblessしたクラス内で扱うこと。 トリッキーな使い方は可読性、可搬性を下げるのみ。 自己満足はできるかもしれないが。
220 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 10:48:10 ] 文字と数値を区別しないで済む。あれこれ悩む必要が無くなる。 それがperlの特徴なのに。(スクリプト系言語はたいていそうなてる) これじゃまるで、パンツの見えないミニスカートを買ったのに パンツの見せ方を教えてください、って言ってるようなもん。
221 名前:デフォルトの名無しさん [2009/09/06(日) 12:51:42 ] 文字列中にある単語をマッチさせて複数取り出すにはどうすれば綺麗に書けますか? 今やりたいことは、あるウェブページ中にある画像のURLだけを取ってきたいと思っています。 $contents = get($url); # LWP::Simple $contents =~ /(http:\/\/[^"]+[.]jpg)/; # jpgだけゲット $image = $1; ↑こうやりますと最初にマッチしたものは取り出せるのですが、 2番目以降もまとめて上手く配列などに取り出せないでしょうか。
222 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 12:59:34 ] gつけて@に入れる
223 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 13:20:57 ] >>222 ありがとうございます。 置換のときは使っていたのですが、こんな風にも使えるのですね
224 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 15:00:28 ] while ( $contents =~ m/(http:\/\/[^"]+[.]jpg)/g ) { print "$1はうんこ\n"; }
225 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 16:45:39 ] >>218 簡単な方法は、$foo ^ $foo の結果を見ること。 0だったら$fooは数値、空文字列だったら$fooは文字列。 数値をお互いにXORするとゼロになるし、 文字列をお互いにXORするとナルストリングになる。 >>221 本当に画像だけ取って来たいなら素直にWWW::Scraper使え。 それだと本文中のURLも拾うぞ。それでもいいなら構わんが。
226 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 17:13:52 ] >素直に○○使え 最近、こういう言い回しが増えたよね。 べつにひねくれて星を睨んで「○○」を使わないワケじゃないと思うよ。 ただ「○○」という便利なものが存在するとは知らなかっただけだと思うよ。 なんかさ、「素直に○○使え」って言い回しするヤツって 女子校生が「ちょ〜〜〜やばいしぃ〜〜」とか言ってるのと同じ臭いがする。 オツムが弱そう。バカっぽいな。
227 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 18:30:40 ] >>226 素直に○○する、ってのは、(深く考えず)○○した方が物事がすんなりと運ぶ、という意味なんだが。 辞書があるなら引くといい。
228 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 18:35:23 ] (深く考えずに)すんなりと○○した方がよい、か。
229 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 18:47:04 ] >>226 素直にやばいしぃ〜〜
230 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 19:11:04 ] >>225 ほー、WWW::Scraperで画像をスクレーピングできるとは知らなかった。 Web::Scraperは知ってたけど。
231 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 19:20:01 ] >>227 韓国の辞書も北朝鮮の辞書も持ってません
232 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 21:30:07 ] >>320 画像->画像表示を示すURI、WWW::Scraper -> Web::Scraperの間違いだな。 訂正サンクス。 >>231 「単品で迷うなら素直にランチにしなよ」とか普通に使う用途なんだが、 こんな簡単な日本語取り違えるとはゆとりのなせる業か。 >オツムが弱そう。バカっぽいな。
233 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 21:40:07 ] >>225 空文字列じゃなく "\x00" x 文字列長 になるんじゃないかな print length 'foo' ^ 'foo', '/', unpack 'H6', 'foo' ^ 'foo'; # 3/000000 >>214 内部的にどう扱われているかでなく、数値コンテキストに置いた時に 解釈可能な文字列かどうかを判定したいなら Scalar::Util::looks_like_number() cpansearch.perl.org/src/GBARR/Scalar-List-Utils-1.21/lib/Scalar/Util/PP.pm
234 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 21:47:31 ] >>233 そのようだな。補足サンクス。Cと混同していたようだ。
235 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 21:53:24 ] >>232 で? その”普通に使う用途”が載ってるのは、韓国の辞書?北朝鮮の辞書?
236 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:01:59 ] >>235 引くに引けないのはわかるけど、負け戦で頑張っても意味無いよ。 黙って日本語を勉強しなおすといい。
237 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:03:40 ] >>235 日本の辞書の例: dic.yahoo.co.jp/dsearch?enc=UTF-8&p=%E7%B4%A0%E7%9B%B4&dtype=0&dname=0na&stype=0&pagenum=1&index=11591609974300 >>226 は第2義しか頭にないらしい。 日本人なら文脈からして4義が5義と考えるのが普通。
238 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:04:56 ] つーか大陸のレッテル貼れば何とかなるとか思ってある辺りがもうね。
239 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:07:36 ] 変なタイミングで中韓出してくる子は、大抵日本のお荷物。
240 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:49:12 ] >>237 やっぱりチョンの会社の辞書を出したか。今は日本に帰化してるが。
241 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:55:57 ] >>211 をコピペして実行してみたけど、正常に実行できる。 問題点は他にあったんじゃ?
242 名前:デフォルトの名無しさん [2009/09/06(日) 23:32:31 ] >>241 レスありがと 211だけど、仰るとおりperlのプロセスがループしてた 正常な状態だったら問題なく動いたわ かなり時間を費やしてしまった…… 基本的に引数は参照渡しでいいんだよね?
243 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 23:34:02 ] >基本的に引数は参照渡しでいいんだよね? どこでそんなの習ったんだ?
244 名前:デフォルトの名無しさん [2009/09/06(日) 23:36:47 ] >どこでそんなの習ったんだ? どこかのサイトに書いてあった記憶がある 片っ端から初心者向けサイト回ってたからどことは言えないけど オレが勘違いしてるのかな
245 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 23:59:09 ] たぶん、値のコピーを作らないように参照渡しにする、って書いてあったんだろうけど Perlの関数呼び出しは値渡しじゃなくて変数渡しだから、わざわざリファレンスにする必要はないよ。 @_には引数がコピーされて入っているのではなく、引数そのものの別名になっている。
246 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 00:02:33 ] 配列やハッシュを渡すときは必要だけど。
247 名前:デフォルトの名無しさん [2009/09/07(月) 00:17:22 ] レスありがとん 変数を渡すときはそのままでも値がコピーされなくて 配列とかハッシュはコピーされちゃうからメモリが勿体無いと 勉強になったわ
248 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 03:17:01 ] >>247 サブルーチンの引数として配列やハッシュを複数渡すと、単一のフラットなリストとして @_ に展開されますが、エイリアスとしての動作は変わらないため値のコピーは発生しません。 >246 が言う必要性とは、「単一のフラットなリスト」にされては困る場合、すなわち引数を渡された関数内で個々の配列を峻別して処理しなければいけない場合に、参照渡しが必須になるという意味です。 ちなみにハッシュのキーに限り、キーそれ自体は変数ではないため、エイリアスの内容を変更しても元のハッシュのキーは変化しません。
249 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 04:52:06 ] >>233 >空文字列じゃなく "¥x00" x 文字列長 になるんじゃないかな じゃあ、結局データが文字列か数値かを知りたいときはどうするのがいいんでしょうか。 今まさに1と"1"を別に扱いたい場面に直面しています。
250 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 05:25:56 ] >>249 データ構造を作り直して回避する。
251 名前:233 mailto:sage [2009/09/07(月) 05:56:07 ] >>249 いや俺に訊かれても。その二つを区別しなきゃいけない状況に陥った事なんて無いし。 sub is_num { ($_[0] ^ $_[0]) !~ /^\x00/ } print is_num($_) ? 'num' : 'str', "\n" for 0, '0', '+1e3', +1e3; …とでもしときゃいいんじゃない。すっごくアホ臭いけど。
252 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 06:35:52 ] はじめてCPANパッケージを作ろうとしている最中です。 質問があります。 (1) READMEの推奨される書き方やフォーマットはありますか。 (2) Changesの推奨される書き方やフォーマットはありますか。 (3) テストファイルが t/*.t のようですけど、test/*.pl にするのはよくないですか。 (4) パッケージのファイル名と、ライブラリ名が異なっていてもいいでしょうか。 たとえば Foo というライブラリを提供するパッケージとして、 Foo-entry-1.0.0.tar.gz # 機能限定版 Foo-full-1.0.0.tar.gz # 機能強化版 のように用途別・目的別に別々のパッケージを用意しようとしているんですが こういうのはまずいでしょうか。何か問題があれば教えてください。