Perlで以下の通り、
htmlファイルを全て読み込んだ後に正規表現を当てたいのですが、うまくいきません。
恐縮ですが、原因をご存知の方いらっしゃいましたら教えて頂けませんでしょうか。
また、他に良い解決方法がありましたら教えて頂けると幸いです。
※PC環境はwindows7, perl5.12です。情報に不足がございましたらご指摘下さい。

-----
#--test.html(左側の数字は行数)
000001 <dl>
000002 <dt>aaa</dt>
000003 <dd>12345</dd>
000004 </dl>

(中略)

120001 <dl>
120002 <dt>bbb</dt>
120003 <dd>6789</dd>
120004 </dl>

#--test.pl
open IN , "test.html";
local $/ = undef;
$data = <IN>;
close IN;

$data =~ s|<td>bbb</td>|<td>ccc</td>|;
print "$data\n";
-----

ファイルの始めの方だと当たるのに、後半では当たりません。
正規表現の対象として大きすぎるんでしょうか・・・。

$data =~ s|<td>aaa</td>|<td>ccc</td>|;
は、当たりますが

$data =~ s|<td>bbb</td>|<td>ccc</td>|;
だと当たりません。

どうぞよろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

参考までに、ideoneでの実行;



http://www.ideone.com/lziei

質問文の例は普通に動いてるので、SJIS変換してるあたりに原因があるかも。ないかも。
    • good
    • 0
この回答へのお礼

お礼遅くなり申し訳ございません。
ご確認頂きありがとうございました。
(ideone.com 知りませんでした、こんなサイトがあるんですね)

ちょっと時間がとれなくて細かい検証はできていないんですが、
仰る通りどうやらSjis.pmが悪さしていたようです。

お礼日時:2011/04/18 20:26

確認ですが, この例で


1行ずつ処理したときには想定した通りの結果になっている
のですね?

この回答への補足

ご質問頂きありがとうございます。
はい while(<>) で処理した場合は想定通りの結果になります。

ただ一点補足がございます。
上記の質問では、関連は薄いと思いあえて記載しなかったんですが、
このhtmlファイルはSjisテキストで、それをSjis.pmを使って処理を行おうとしています。

通常のエンコードした場合で試していなかったので
ちょっと後で試してみようと思います。

補足日時:2011/04/17 17:01
    • good
    • 0

open IN , "test.html";


my $data;
{
local $/ = undef;
$data = <IN>;
}
close IN;

でスコープに入れてはどうでしょう。$/ undefしたままで他の処理を行おうとすると予期せぬ結果になるかもしれません。
    • good
    • 0
この回答へのお礼

ご回答頂きありがとうございます。

スコープ試してみて結果は変わらなかったんですが、
そもそもスコープに入れる発想が無かったので勉強になりました。
ありがとうございました。

お礼日時:2011/04/17 16:53

td? dt?

この回答への補足

大変失礼しました。
正規表現中の "td" は "dt" の間違いです。
ご指摘頂きありがとうございました。

補足日時:2011/04/17 12:50
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング

おすすめ情報