Perlについての質問箱 2箱目

このエントリーをはてなブックマークに追加
>>895
s/\r\n/\n/g;
みんなこうやって書いてる?
s/0x0D0x0A/0x0A/g;
と書かない?
掻きません。
>>900
> s/\r\n/\n/g; 
> みんなこうやって書いてる?
> s/0x0D0x0A/0x0A/g; 
> と書かない?
最近は余り意味が無いように感じてきたので、
私は \r\n で書いてます。

改行が間違いなく CRLF という場合を除いては
s/(\r\r\n|\r\n)/\n/g;
と、書いてる事が多いかもです。

# s/\r\r\n/\n/g;
# s/\r\n/\n/g;
# とした方が処理が早いんだっけか。
# 眠くてなにも考えられん..
>>902
\nって

Windows系だと0x0D0x0Aで
UNIX系だと0x0Aで
Mac系だと0x0D

だと思ってるんですが、これは私の認識違いでしょうか?
904903:02/12/26 04:31
追記でう。

私は>>903と思ってるので、

\r\nだとWindowsで動かした時には0x0D0x0D0x0Aで
Linuxで動かした時には0x0D0x0Aになってしまう

と認識してます。
(昔これではまった記憶があるのですが。。。
最近は状況が異なるのでしょうか?)
範囲指定演算子の .. と ... の違いが分かんないっす
というか、... って5.6からなのかな?
.. の方は

while(<>){  print if /hoge/ .. /fuga/; }

こんな感じで使ってたんだけど、...は動作がどう違うんだろう
>>904
Unixなperl を使用して、Windows上で作成されたファイルを扱うときは
\r\n にしなきゃダメだと思われ
perlインタプリタの環境と、対象ファイルの環境が一緒なら
\n で、それぞれの環境に合った上手い処理をしてくれるはず。
>>906
Win上では入力の場合は改行コードはバイナリとして入力され
出力の場合はテキストとして出力されるので
その結果入力されたWinの改行コードは\r\nだが
(これが\nに変換されれば問題ないが、そうならない)
出力された場合は\nが\r\nになってしまい
何もしないと\r\r\nとなってしまう事を言ってるのだと思われ
by ActivePerl 5.22
>>906
>perlインタプリタの環境と、対象ファイルの環境が一緒なら
>\n で、それぞれの環境に合った上手い処理をしてくれるはず。
だからこそ、環境依存の\nを使うより環境非依存の0x0A(0x0D)を使った方が
いいんじゃないかと思っているのですが。
例えばUNIXな"0x0A"を Windows上で s/\n//g しても消えないですよね?

試しにこんなもの作ってみました。

open(IN, "LF.txt");
$_ = join('', <IN>);
close(IN);

s/\n//;

print;
間違えました・・・(鬱氏
-------------------------
open(IN, "LF.txt");
$_ = join('', <IN>);
close(IN);

s/\r\n//;

print;
-------------------------

です。LF.txtの中身は 文字"a"と改行です。
で、改行コード LF(UNIX)・CRLF(Windows)の2種類で試してみました。
910結果です:02/12/26 06:47
実行環境はWindowsです。

$ perl hoge.pl | dump # LF(UNIX形式)

Addr 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------
00000000 61 a

$ perl hoge.pl | dump #CRLF(UNIX形式)

Addr 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------
00000000 610a a.

このように s/\r\n// だと、Windows上で実行した時に s/0x0D0x0D0x0A//となってしまうので
よろしくないと思ったのです。
連続投稿ごめんなさい。
>>907
>その結果入力されたWinの改行コードは\r\nだが
>(これが\nに変換されれば問題ないが、そうならない)
>出力された場合は\nが\r\nになってしまい
>何もしないと\r\r\nとなってしまう事を言ってるのだと思われ
揚げ足取るつもりじゃないですが、何か変です。
UNIXでもWindowsでも改行コードは\nです。
でも、\nの実際のコードが"0x0A"なのか"0x0D0x0A"なのかの違いがあるのです。
>>908
文字コードなんてもの自体が環境依存なので
>環境非依存の0x0A(0x0D)
と思ってる点で、すでに間違いだから考え直した方が良いよ
>>911
違うって
試しにWin上でbinmode使って出力してみ
>>912
どういうことですか?0x0DはどのOSでも0x0Dじゃないですか?
>>913
binmode(STDOU)でも結果は同じです。
そうじゃなくて、s///でマッチさせる時に\nを使うと、
0x0Aになるのか0x0D0x0AになるのかはOS依存だからマッチに失敗する時があるといいたいんですが。
(Macほったらかしですけど)

916デフォルトの名無しさん:02/12/26 07:10
質問です。
現在Perlの-cオプションを使って構文チェックをしているのですが、このとき、絶対にコードを実行させないようにしたいのです。
暫定的に'BEGIN'や'END'を含むコードを弾くようにしてみたのですが、これでコードは確実に実行されなくなりますか?
それとも、もっと簡単な方法があるのでしょうか?
>>915
そう言う事を言いたかったのね…だったら
open(IN, "LF.txt");
の後で
binmode(IN);
で試してみ
テキストモードで入力すれば0x0d0x0aにマッチするけど
バイナリモードで入力すれば0x0aでマッチするから
ちなみに0x0AはどのOSでも0x0Aだが
それが改行コードとは限らないので
その結果正しく動くとは限らない
(極端な話0x0Aが数字の"1"等であっても構わない)
>>917
binmodeしようが何をしようが、\nの実際のコードがOSによって変わるのだから、
例えばbinmode入力が"0x0A"であった場合(UNIXのファイルを読む場合)、
s/\n// によって改行が消えるのはUNIX系だけです。Windows系ではそもそもマッチしません。
同様に s/\r\n//だとUNIX系でもWindows系でもマッチしません。

また、binmode入力が"0x0D0x0A"であった場合(Windows系のファイルを読む場合)、
Windows系ではs/\n// によって改行が消えますが、UNIX系では\r(0x0D)が残ってしまいます。
同様に s/\r\n//だとUNIX系では消えますが、もWindows系ではマッチしません。


>>918
そうなんですか。。。ASCIIに従うコード体系を使っていれば0x0Dが復帰で0x0Aが改行だと思っていたのですが。。。
#ところでこれ、話ずれてません?
>>918
これって本当?
>>919
ちゃんと試した?
これは多分UNIXとの互換性を考えて出来たシステムだと思うけど
少なくともActivePerl 5.22ではbinmodeで入力したファイルの
改行コードは\nでも\r\nでもマッチするように出来てるよ
確か、これは何かの本(思い出せないけど)にのってた話だったんだけど
もし試して駄目だったら、一時的なバージョンだったのかな…?
922921:02/12/26 07:49
>改行コードは\nでも\r\nでもマッチするように出来てるよ
もちろん\nの場合は0x0dが残ります
>>919
MACは0x0Dが改行で0x0Aが復帰
>>921
なるほど。そうだったのですか。
うちは
$ perl -version
This is perl, v5.6.1 built for cygwin-multi

なのでActivePerlは知りませんでした。

ところでActivePerl では

print scalar(split(//,"\n"));

の結果はどうなりますか?
925マカ ◆F52DmOxJlc :02/12/26 09:03
今の Mac は UNIX だから 0x0A が改行なんだが…。
すいません。自分で話を大きくしておいて恐縮ですがスレ違いですね。
誰かが↓に投げてました。(私じゃないですよ。マルチポスト断固反対!)

***すれ立てるまでもない質問はここで 第28刷***
http://pc3.2ch.net/test/read.cgi/tech/1040473175/274-

ですので、この話題は終わりということで。>>924も忘れていいです。
失礼しました。
927デフォルトの名無しさん:02/12/26 11:53
perlのdumpを使って、coreを吐かせるのはいいんだけど
undumpってのはどうやって入手するん?

ftpサイトから持ってきたundump.cをコンパイルしようとしたんだけど、
makeできなかったし。

ちなみにOSはSunOSの5.6らしい
928デフォルトの名無しさん:02/12/26 17:12
$aaa = \'aaa';
$str = \"aaa is $$aaa\n";
print "$$str\n";
$aaa = \'bbb';
print "$$str\n";
こういうコードを書いてみたのですが、二つのプリント文は同じ結果を返します。
おそらく$strに文字列のリファレンスを代入する時点で、一時オブジェクトを
生成してしまうようですが、これを避ける方法はありませんか?
やりたいこととしては、任意の時点において文字列の中身を自由に差し替えたい
のですが。。。やはり文字列集合として、配列として構成しなくてはならないですかね
929デフォルトの名無しさん:02/12/26 18:13
>>928
求めているものと同じかどうかは分からないが。

$aaa = 'aaa';
$str = 'aaa is $aaa';
eval "print \"$str\n\"";
$aaa = 'bbb';
eval "print \"$str\n\"";
930デフォルトの名無しさん:02/12/26 18:13
>928
やりたいことがよくわからないが、出力のデフォルト文字列をテンプレートとして
置換をかけてはいかんか?


$str = "aaa=_Change_String_";

print chg_prin($str, "aaa");
print chg_prin($str, "bbb");

sub chg_print
{
shift $a = $_;
shift $b = $_;
a =~ s/_Change_String/$b/;
return a
}


931デフォルトの名無しさん :02/12/26 18:13
>>928

$strcode = '\"aaa is $$aaa\n";'; # (*)

$aaa = \'AAA';
$str = eval $strcode;

print $strcode, "\n";
print $str;

(*)でquoteに"..."を使うと
$strcode = "\\\"aaa is \\\$\\\$aaa\\n\";";
みたいな感じになる。
あと、他の別解としてソフトリファレンスとか。
932デフォルトの名無しさん:02/12/26 18:16
すごいなあ。重婚かよ。
やっぱりevalをつかうしかないですかね。
なんとなくevalは遅いというイメージがあって
使いたくないので、リファレンスの配列という形にして
やることにします。どうもありがとうございました。
934デフォルトの名無しさん:02/12/26 18:46
G(3);
sub G{
my $a=shift;
if($a>0){
G($a-1);
print"$a\n";
G($a-1);
}print" \#$a\n";
}
この処理の流れが良く理解できません
アドバイスなどお願いします
ただ再帰的にG()を呼び出してるとかじゃなくて?
936934:02/12/26 19:13
吐き出される結果を見て
途中から流れ方が分からなくなります
forループなんかだとprintかましまくったら
結構すぐわかるんですが。。
おなじところで二度も再帰呼び出ししてるからどっちか消せば見通しよくなるんじゃない?
それと再帰呼び出しは引数に対する終了条件をよく考えておく。
この関数は単純だからただ一つの引数0が入ってきたら再帰呼び出ししないっていう
単純なもの。がんばってね。
938934:02/12/26 20:57
実はjavaを勉強中でして『ハノイの塔ゲーム』って
ところでこのソースを使うんですが演算はperlの方が
簡単に検証出来るかと思いまして
 #0
1
 #0
 #1
2
 #0
1
 #0
 #1
 #2
3
 #0
1
 #0
 #1
2
 #0
1
 #0
 #1
 #2
 #3
この吐き出される順序がどの様になってんのかと?
939デフォルトの名無しさん:02/12/26 21:20
                                稚内  国後
                             札幌旭川網走
                              十勝根室
                            函館 室蘭

                             青森
                            秋田岩手
                            山形宮城
                        佐渡  新潟福島
                         富山群馬栃木
          島根鳥取兵京都福井石川長山(゚∀゚)茨城
長佐福岡 山口広島岡山庫大奈滋賀岐阜野梨東京千葉
崎賀熊大分          阪良三重愛知静岡神奈川
   本宮崎  愛媛香川  和歌山
   鹿児島  高知徳島          大島
沖縄                    小笠原
だったら君、まずやるべきはハノイの塔の解き方の研究じゃないかな。
M-x hanoiとやってごらん。段数が多すぎて目が回るときはC-x 3 M-x hanoiだ。
941934:02/12/26 22:15
いやだからどこで値が保持され
どこで吐き出されるのかをしりたい
流れです 流れ〜。。

>>939
ワラタッ
(´-`).。oO(単に再帰が理解できてないだけかも…)
943 ◆F52DmOxJlc :02/12/27 00:03
>>934
G() を展開してフローチャート書けば?
G() を3回再起呼び出しすると $a = 0 になって if がスキップされる。
944934:02/12/27 01:27
チャート書いて出直してきます
 頭痛て〜
>>934
まぁあれだ。マルチポストは止めとけ。
>>928
素直に printf を使うべきでは…?

$aaa = \'aaa';
$str = \"aaa is %s\n"; # <-- %s に変化部が入る
printf $$str, $$aaa, "\n"; # <-- 変化部を与える
$aaa = \'bbb';
printf $$str, $$aaa, "\n"; # <-- 変化部を与える
>>934
表示にインデントを付けてみたけど、これなら解かりやすい?
再帰関数や二分木のデバッグ表示に良く使う手…。

my $ind = 0; # <--インデント(再帰呼出)の深さ
&G(3);
sub G{
my $a=shift;
$ind++;
if($a>0){ # (引数がゼロのときは再帰呼出をしない)
&G($a-1);
print "\t" x $ind, "$a\n"; # ( x は文字列リピート演算子 )
&G($a-1);
}
print "\t" x $ind, " #$a\n";
$ind--;
}
948946:02/12/27 12:30
あー少し間違いた。printf の第3引数"\n"はこの場合何の役にも立たんわ(^^;
949934:02/12/27 13:32
マルチポスト すんません
だいぶ理解できてきました
950デフォルトの名無しさん:02/12/27 18:10
$random = 0;
while($random == 20){
$random = int( rand(100) ) + 1;
print "$random<br>";
}
print "$random<br>";

このプログラムを実行するとどうもwhile文の中をスルーしているみたいなんですが
どこかプログラムがおかしいのでしょうか?

プログラム的には$randomが20になったらループから抜けるプログラムです。
冬休み
>950の頭がな。
while()の使い方勉強し直したほうがよさげ。
>>950
板違い
>>950
while判定式の真偽の意味をキチンと理解してないからだろうなぁ…。
そのコードでは、ループは一度も実行されないのが正しいぞ?w

希望するループの脱出条件は「20になったら」であるから──

$random = 0; # <-- ゼロ初期化されている=20では“ない”
while ( $random != 20 ) { # <-- 20では“ない”時はループせよ

または、

until ( $random == 20 ) { # until=while とは真偽判定が逆の命令
インターネット上のファイル(.html)が存在するかどうか
インターネット上のファイルのオープン

で困っています。if(-e $URL)やopen(FILE,$URL)でいいんですか?
956デフォルトの名無しさん:02/12/27 21:16
そろそろ正月だし、おめでたいなぁ
>>955
それではムソ。いくつか方法はあるんだが…、

1.CPANでその種のモジュールを探してきてインストールする(具体名忘れた、スマソ)
2.(UNIXでなら外部コマンドの) wget などを利用して読み込む

open FILE, "wget $URL|" or die;
binmode FILE;
$data = join '', <FILE>; close FILE; # (エラー処理やタイムアウトは知らん)

3.自力で低レベルコーディングするw

この辺がサンプルになるとオモワレ。
ソース?: ttp://multix.jp/download/perl/httpget.cgi
実行例?: ttp://multix.jp/cgi-bin/httpget.cgi
959 ◆hMJAPH9PWA :02/12/28 09:27
>>899
perl5.8.0は以前のバージョンとバイナリ互換がないので、
XSを使ったモジュールは5.8.0用にビルドされたものじゃないと動かないよ。
それが5.8.0に対応するのを待つか、他のを探すか、自分でビルドするしかないね。
960950:02/12/28 13:00
>>954
恥ずかしい。すごく簡単なことだったんですね。
あんな簡単な事も丁寧に教えてくださってありがとうございます。
とても参考になりました。
>>958
ありがとう。HTMLなんだけど、やっぱりバイナリとして開いたほうがいいのかなぁ。
use LWP::Simple;

my $url = 'http://pc3.2ch.net/test/read.cgi/tech/1033688230/l50';
my $text = get $url;
$text =~ s/<br>/\n/ig;
$text =~ s/<dd>/\n/ig;
$text=~ s/<.*?>//sg;
$text=~ s/</</g;
$text=~ s/>/>/g;
print $text;
exit;
963デフォルトの名無しさん:02/12/28 18:35
955さんではないのですが、似たようなプログラムで悩んでいます。
htmlを取ってきた後、そこに含まれるURLを取り出してリスト(txtとか)に
するにはどうしたらいいでしょう。
更にはそのリストを使ってたくさんのサイトを巡ってプレーンテキストを
収集するプログラムが作りたいのですが・・。
根本的にチグハグな>>961がいるスレはここですか?
965デフォルトの名無しさん:02/12/28 19:08
>>822 みたいに fork を使いたいのですが、 >>822 のままだと
1秒毎にゾンビプロセスが残ります。
fork の最後に exit してるのに何故でしょう?
>>964
うん…。萎えるよねぇ。

>>963
とりあえずHTMLを取ってくる方法は>>958>>962
参考にしていただくとして、例をあげると、

$/ = undef; # (次の行のための細工)
$_ = <>; # 仮に標準入力からHTMLテキストを頂くとして
s/\s+/ /g; # 邪魔な改行や連続空白を整理
s{(src|href)\s*=\s*"?([^"]+)"?}{ # それっぽい所を抜き出す
push @urllist, $2; "";
}eg;
print "$_\n" foreach (@urllist); # 標準出力へ書き出す

注:相対URLの絶対アドレス化までは面倒見てないし、
空白を含むような変態アドレス(爆)にも対応してないし、
リンクタグになってないURLも無視している。

あとはこの処理結果を更に再帰的にやってみる?(無限ループしそうだが)

>>965
waitpid 関数のドキュメントも参照してみたらどうだろう?
967963:02/12/28 20:04
>>966
標準入力から渡したのはちゃんと抽出できました。
この$_ = <>;をソケット先の読み込んだのにしてあげれば良いのですね。
試行錯誤してみます。
組み始めて1ヶ月くらいなので解からないことばかりで^^;
ありがとうございます><
use LWP::Simple;
use HTML::LinkExtor;

my $url = 'http://www.google.com/intl/ja/';
my $p = new HTML::LinkExtor(\&want, $url );
$p->parse(get $url or die "filed:get $url");
exit;

sub want
{
my($tag, %links) = @_;
$tag = lc $tag;
return unless $tag eq 'img';
print $links{ src }, "\n";

}
<Table></table>の中に<table></table>といくつか入っているのですが、
そと側の<table.にマッチさせるにはどうしたらいいdねすか?

「<table>の開始タグと終了タグを一致させたい」みたいな
970963:02/12/28 22:01
>>968
すごい。。相対的なURLもこれだけでOKなんですね。
末尾に/がないものや.cgi等も持ってきちゃう場合は
削除や書き込まないようにすればいいのでしょうか。
>>970
ちょこっとでいいからソケットプログラミングやってみると良いと思われ。
便利なライブラリを使うとすぐできちゃうけど、
それだと基本が身につかないから応用ができないよ。
972デフォルトの名無しさん:02/12/28 23:24
>>971
始めてから1箇月でこの程度の才能無しにアドバイスしても
無駄だと。
そんな程度でageるやつもどうかと。
974デフォルトの名無しさん:02/12/29 20:27
Net::SCP 使ってファイル転送したいのですが、認証がうまくいかないようです。
RSA1? RSA2? どれを使えばいいのでしょうか?
検索してみても有効な結果が見つかりませんが、perldoc以外のサンプルコードありませんか?
975デフォルトの名無しさん:02/12/29 22:15
<a href="ここ">ここ</a>(ここ)
上の「ここ」の部分を取得したいのですが、色々な例外を考えて
いくとどうも上手くマッチさせることができません。
考えなくてはならないことは
・タグの中には余計な要素があるかもしれない
・最後の要素と閉じタグの間には文字があるかもしれない
・最後の要素はないかもしれない

これを考えていき(\nはないものとして)
/<.*?a.+?href=\"(.+?)\".*?>(.+?)<\/.*?a.*?>.*?(\(.+?\))?/ig
としてみたのですが、最後の要素と閉じタグの間に文字があると
例えあっても、最後の要素がないことになってしまいます。

この場合にはどのようにするのが適当でしょうか?
何でも . を使うな。
977 ◆F52DmOxJlc :02/12/29 22:28
>>975
/<.*?a.+?href=\"(.+?)\".*?>(.+?)<\/.*?a.*?>[^(]*(\(.+?\))?/ig
これでどうだ?
.*? を [^(]* に変更。
( 以外の何かの0回以上の繰り返し。
978977:02/12/29 23:08
>>976 >>977
ご指摘ありがとうございます。 . で表しすぎているということに
気付きました。
> /<.*?a.+?href=\"(.+?)\".*?>(.+?)<\/.*?a.*?>[^(]*(\(.+?\))?/ig
これを試してみたのですが下の
<a href="xxx">xxx</a><a href="xxx">xxx</a>(xxx)
全体にマッチしてしまいます。上の文字列に対しては
2回マッチするようにしたいのですが、
少し考えてイメージとしてはこんな感じなのですが
/<[^>]*?a[^>]+?href=\"([^\"]+?)\"[^>]*>(.+?)<\/[^>]*?a[^>]*?>[^(?:<a)]*?(\([^)]+?\))?/i
[^(?:<a)]←この <a という文字列以外にマッチという部分が
実際は上手く表せません。
何か良い手はないものでしょうか。
979975:02/12/29 23:09
>>978 の名前を間違えて977にしてしまいました
.*?ってさ、.*とどう違うの?何か違うのか?素人考えでスマンが。

<[^>]?a だと <!DOCTYPE html PUBLIC (略) Tradi...のaなんかにもマッチしてしまわないか?
<a で良いと思うんだけど。

あと、hrefの値に"があると分かっているの?
場合によっては "が'になっているかもしれないし。
981975:02/12/30 00:00
/<[^>]*?a[^>]+?href=\"([^\">]+?)\"[^>]*?>(.+?)<\/[^>]*?a[^>]*?>(?:(?:<(?!a))|[^<])*?(\([^)]+?\))?/i
試行錯誤してこのような形になりました。これでも
</a>と(xxxxx)の間に文字があると失敗してしまい上手く取得することができません。

>>980
>.*?ってさ、.*とどう違うの?何か違うのか?素人考えでスマンが
<[^>]*a[^>]
のように書き始めてしまうと<a href="a.html">でa.htmlのaまで
マッチしてしまい、上手くいかないと思い<[^>]*?aで書き始めました。

><[^>]?a だと <!DOCTYPE html PUBLIC (略) Tradi...のaなんかにもマッチしてしまわないか?
これは hrefの段階でマッチが失敗するので大丈夫だと思います。

>場合によっては "が'になっているかもしれないし。
確かにその通りでした。("|')?のようにして上手くしのぎたいと思います。
982975:02/12/30 00:02
激しく嘘を書いていました。

>のように書き始めてしまうと<a href="a.html">でa.htmlのaまで
>マッチしてしまい、上手くいかないと思い<[^>]*?aで書き始めました。

これはまたhrefでマッチが失敗するので大丈夫ですね・・・
<a target="top" href="xxxxx">の場合にtargetのaにマッチしてしまうため
<[^>]*?a
として書き始めました。
983デフォルトの名無しさん:02/12/30 00:08
……むりに一発ですべて取得しなくても……
HTML/SGML/XML系タグパースは無茶苦茶難しい。
どこかで妥協しないと泥沼確定。正規表現は万能に近いが得手不得手はある。
#特に iso-jis や Shift_JISコードが混じってると余計に死ねるw

>>980
/.*?/ の?は最短マッチフラグ。普通“.*”は最長一致(貪欲マッチ)だが、
最初に検索条件を満足したところでストップ(break)をかけるために使う。

$_ = "1,2,3,";
print $&, "\n" if /.*,/; # 1,2,3, <- 最後まで全部当たってしまう
print $&, "\n" if /.*?,/; # 1, <- 最初に当たったところで止まる

このフラグはどんな量指定子にも使える。
?? +? *? {n}? {n,}? {n,m}? といった具合。(続に言うPerl拡張)

/<[^>]?a/ だけど、昔はともかく現在は
タグ開始を示す“<”の直後に空白や改行を入れるのは
イリーガルなはずなので、/<a/ で充分だろうなぁ。
逆にタグ内や“=”の前後、“>”直前の空白&改行挿入とかは許されるので
そういうのまで考えてくと本当にキリがない。
素直に既存のモジュールから使えそうなのを探したほうが楽よ。
#それでも「(>_<)」といった顔文字があると動作が狂いやすいが…。
985975:02/12/30 01:25
>>984
確かにこのままでは無理そうなので、妥協して
aタグ以外を取り払ってからマッチさせることにしました。

s/<\/[^a][^>]*>//ig;
s/<[^a\/][^>]*>//ig;
/<a\s*href=\"(.+?)\"[^>]*>(.+?)<\/a>\s*(\(.+?\))?/i;

特定のサイトのを取ることができればよかったので、
とりあえずは上手く動かすことができました。
986デフォルトの名無しさん:02/12/30 02:23
質問です。

「1〜36の数字があって、その中からランダム数字を選んでに10対のペアを作る。
 ただし、選ばれる数字(この場合には全20個)には同じ数字が含まれてはならない。
 (つまり一度選ばれた数字は2度と選ばれないということ。)」

さて、どうやったらいいですかねえ?
配列を使うということくらいしか思いつかない。
ちゃんと確かめてないし眠いしチャット中の相手の返事町の間に考えたものですが。
for ($i = 1; $i <= 10; $i++) {
$x = int(rand(36));
if (!$a{$x}) { $a{$x} = 'hoge'; }
}
@a = %a;
for ($i = 1; $i <= 10; $i++) {
$x = int(rand(36));
if (!$a{$x}) { $a{$x} = 'hoge'; print "$a[($i -1)*2]\t$x\n";}
}
988987:02/12/30 03:02
絶対動かないなこれ。スマソ
10満開ぐらい動かせば奇跡的にうまくいくかもしらんけど。
ttp://www.din.or.jp/~ohzaki/perl.htm#Mail
メールアドレスもまじめにやるとこんな感じになっちまうらしいしな。
990 ◆F52DmOxJlc :02/12/30 07:22
>>987
出勤前で時間がないので考え方だけ。
・配列に 1 - 36 を格納。
・int(rand(36)) で一つを決定。
・決定した数字を配列から消す。これで配列の要素が一つ減る。
・以下 int(rand(35)), int(rand(34)), int(rand(33)) ...

次スレ、
Perlについての質問箱 3箱目
http://pc3.2ch.net/test/read.cgi/tech/1041205885/l50
>>987
>>990を参考に作ってみた

srand;
@card = (1 .. 36);
$pair = 10;
@result = ();
for($i=0;$i<$pair; $i++){
 ($p1) = splice(@card,int(rand(@card)),1);
 ($p2) = splice(@card,int(rand(@card)),1);
 push(@result, [$p1,$p2]);
}

foreach $in (@result){
 print $in->[0], ":", $in->[1], "\n";
}

一時変数使わないようにしたり、リファレンス止めたり色々出来るけど
分かりやすい基本形って事で
>>984
最短マッチね。さんくす。

そーいや、Perlって「独自拡張」があるんだね。

#旧スレですまん
994986:02/12/31 02:37
>>987,990,992 (同一人物含む?)
さんくす。

> ・決定した数字を配列から消す。これで配列の要素が一つ減る。

の実現の仕方がよく分からなかったんだよなあ。
>>992のコードよく読んで勉強しまつ。
995992:02/12/31 05:10
>>994
$index = int(rand(@card));
($p1) = splice(@card,$index,1);
分けると分かりやすいかも
996
九百九十七
998 ◆F52DmOxJlc :02/12/31 20:06
ん?カウントアップか?
998
1000get.
1000?
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。