※ ChatGPTを利用し、要約された質問です(原文:ファイルのパターンマッチ処理の書き方)
ファイルのパターンマッチ処理の書き方
このQ&Aのポイント
Perlを使ってHTMLファイルからリンクを抽出するスクリプトを書いていますが、抽出部分の書き方を改善したいです。
Perlと比較してsedコマンドの方が簡潔に書けるため、perlでの書き方について教えてください。
また、改善案や別の方法があれば教えていただけると嬉しいです。
現在Perlを勉強中です。
あるところからhtmlファイルをダウンロードした後、リンクを抽出する
というスクリプトを、以下のように書いてみました。
(ファイルの各行について、「href="」と「"」の間にある、「"」以外が連続する部分を抽出する。 という考えです。)
----ここから-------------------------------------------------
#!/usr/bin/perl
#####################################################
#ここに、あるところから temp.htm をとってくる処理がある。#
#####################################################
# temp.htm 中、 href でリンクされているページを出力
open ( FILE, "temp.htm");
while (<FILE>){
print ("$1\n") if /.*href="([^"]*.html)".*/;
}
---ここまで--------------------------------------------------
この抽出部分はもっと簡潔に書けるものでしょうか?
と言いますのは、これでも、Cに比べれば簡単なのですが、sedなら、
sed -n 's/.*href="\([^"]*.html\)".*/\1/p' temp.htm
の1行で済むところなので、
一々ファイルを開いてwhileでまわすという書き方をするのが面倒だな
と思いましたので質問させて頂きました。
(もっとも、sedはそのために特化したコマンドなので
さすがにそれと同等に簡単に書けることを望むのが間違いなのかもしれませんが、
「簡単なことは簡単に...」がモットーのようなので、ひょっとしてという期待がありまして。。。)
これは、私の書き方が冗長なのか、それとも、perlではこう書くのが普通なのか、
perlの勉強を始めたばかりで判断がつきません。
どちらなのかご教授いただけると幸です。
また、他にもこう書けるまたは私ならこう書くという御意見もお伺いできたら嬉しいです。
宜しくお願いします。
お礼
ご回答ありがとうございます。 やっぱり、-nオプションを使わない場合はfileを明示的に開いてやるしか無いようですね。 また、pオプションで標準出力を期待したのですが、sedのpオプションはperlにはないようで、$_に吐きだすのがperlの仕様ななかなあと思いました。 s/a\(X\)b/$1/p は s/a(X)b/$1/;print; とか print $1 if /a(X)b/; と書くのがperlの書き方のようですね。 ご回答ありがとう御座いました。 と書くしか無いみたいです。