2011-01-29 11 views
3

私は2つの入力をコマンドプロンプトに読み込みます。最初は、書いているプログラムで検索される一連の単語で、2つ目は、その言葉がどこにあるかを知る。たとえば、私のコマンドプロンプトでperl WebScan.plという単語を読み込みます。WebPage000.htmRegexのPerlで配列にアクセスする方法

これらの入力のいずれかにアクセスするのに問題はありませんが、Webページの内容にアクセスするのは非常に困難です正規表現を実行してhtmlタグを削除し、コンテンツにアクセスします。私は、はるかに効果的である正規表現せずにこれを行うために利用可能なサブルーチンがあることを認識し、私は正規表現として行う必要があります:(

ノートラブルで印刷用のHTMLファイルにアクセスすることができます。

open (DATA, $ARGV[1]); 
my @file = <DATA>; 
print @file; 

これはhtmlページのコード全体を表示しますが、htmlブロックを削除するために正規表現を渡すことができません。「s ///の配列逆参照を変更できません"私は特定の正規表現を持っている場所です。私はこれを回避する方法がわかりません - 私はスカラーに配列を変換しようとしたが、私はすべてのHTMLのデータにアクセスすることができません(そしていいえ、それだけではプリントできませんe配列の値の数:

正規表現を使用して出力を絞り込むには、配列の内容にどのようにアクセスすればよいですか?

+0

我々は正規表現コードを参照する必要があります。 – codaddict

+0

@codaddict => 'perl -e '@array =〜s /のようなものからそのエラーが出ます。// ''スカラーコンテキストで配列から返された値が読み込み専用であるため、perlが壊れます。 –

+2

DATAをファイルハンドル名として使用しないでください。特別なファイルハンドルです。実際には、グローバルファイルハンドルを使用せず、字句ファイルハンドルを使用してください。 'open'の3引数形式を使ってそれらを作成します。 $ ARGV [1]を開くことはできません:$!\ n "; ' – daotoad

答えて

14

@file =~ s/find/replace/;のようなものです。正規表現バインディング演算子の左辺がその引数にスカラーコンテキストを課すため、このエラーが発生しています。スカラーコンテキストの配列は長さを返しますが、この値は読み取り専用です。だからあなたの代入が交換を実行しようとするとき、kaboom。

foreach my $line (@file) {$line =~ s/find/replace/} 

以上簡潔として:

s/find/replace/ for @file; 

しかし、あなたは正規表現を実行している場合

ファイルの行のすべてを処理するためには、あなたはforeachループを使用することができますHTMLファイルでは、複数の行にまたがって一致させる必要があります。上記の作業は、ファイル全体を読み込み、各行を@fileの要素として保存することです。 Perlの反復制御構造の1つを配列で使用すると、複数の行を一致させることができなくなります。ですから、代わりにファイルを単一のスカラに読み込む必要があります。期待どおり$file =~ s///を次に使用できます。あなたは一時的に入力レコードセパレータ$/クリアすることにより、単一の変数にファイルを読までき

:一般的に

my $file = do {local $/; <DATA>}; 

を、正規表現は、HTMLを解析するための間違ったツールですが、これは宿題であるように聞こえます割り当て、その場合はそのようにしてください。

そして最後に、現代的なPerlで、あなたは字句ファイルハンドルとエラーチェックでopenの3つの引数形式を使用する必要があります。

open my $DATA, '<', $ARGV[1] or die "open error: $!"; 

my $file = do {local $/; <$DATA>}; 
+0

素晴らしい、ありがとうございます。はい、これは宿題に関する質問ですが、残念ながら、TAではなく、教授も親切でhtmlファイルへのアクセス方法を説明することはできませんでした。 – Sheldon

+0

slurpの代わりに(特に、そのページを最初にダウンロードする必要があるが、ローカルページでも動作する必要がある場合)、LWP :: UserAgent、 'use LWP :: UserAgent;私の$ ua = LWP :: UserAgent-> new(); $ html = $ ua-> get($ address) - > as_string(); 'スカラー$ htmlに$ addressという名前のサイトのHTMLソースがあります。 –

関連する問題