2012-04-11 12 views
3

私は変数として保存する必要がある単純なPerlの正規表現を持っています。変数として一致Perl正規表現を保存

私はそれを印刷する場合:

print($html_data =~ m/<iframe id="pdfDocument" src=.(.*)pdf/g); 

は、それは私が保存したいものを出力しますが、とそれを保存しようとすると:

$link = $html_data =~ m/<iframe id="pdfDocument" src=.(.*)pdf/g; 

私は背中の「1」として値を取得します$link。私はこれが '1'マッチを見つけたためだと仮定します。しかし、代わりにどのように試合の内容を保存するのですか?あなたはまた、全体マッチしたパターン($&)を取得することができます

+0

[彼が来るポニー...](http://stackoverflow.com/a/1732454/554546) –

答えて

4

パターンのマッチした部分式は、変数$1$2などに保存されますが、これは高価であり、避けるべきです。

ここでの動作の違いは、スカラー対リストコンテキストの結果です。それらを知ること、それらがどのように異なっているか、それらがさまざまなPerl式の動作にどのように影響するかを知る必要があります。

+2

は使用しないでください '$&' 。あなたのプログラム全体でキャプチャを使用しないすべての正規表現を遅くします。いいえ、それはPerlの新しいバージョンでは変更されていないので、あなたの投稿からそのビットを削除しました。その欠点がないものを望むなら、/ pと '$ {^ MATCH}'を使用してください。 [perlvar](http://perldoc.perl。org/perlvar.html)を参照してください。 – ikegami

6

すべての一致を得るには/ gに注意してください。それらはおそらくスカラーに入れられません。配列が必要です。

my @links = $html_data =~ m/<iframe id="pdfDocument" src=.(.*)pdf/g; 

あなただけの最初に一致する場合:

my ($link) = $html_data =~ m/<iframe id="pdfDocument" src=.(.*)pdf/; 

注括弧(そして今では無用/グラムの欠如)。リストコンテキストでm //を呼び出す必要があります。 'perlfuncの' ドキュメントから

+0

スカラーコンテキストの/ gは、同じことをしようとしている場合はうまくいきます。キャプチャのリストを取得する必要はありません。 –

+0

@brian d foy、スカラーコンテキストで*/gと言っていない*は役に立たない。私はそれがここでは役に立たないとは言わなかった。スカラーコンテキスト*はここでは役に立たないと私は言った。 (これはまだスカラーコンテキストで行うことができますが、 'my $ link = $ html_data =〜m /...?? $ 1:undef;') – ikegami

0

印刷LIST
は、文字列または文字列のリストを印刷します。

ので、M //戻り値
が は(wantarrayを?)望んでいたと判断しprint m//は、リストが
である(これは、キャプチャグループなしメートル//をappersところ、1または0の一致が
の合否を返しますm // gは一致のリストを返します)。コンテキスト(リストになく)

$link = M //は、スカラーであることができます。
したがって、m //は一致結果1(真)または0(偽)を返します。

0

私はちょうどこのようなコードを書いた。それは助けるかもしれません。それは基本的にあなたのものと似ていますが、私の場合を除き、括弧がいくつかあります。

my $path = `ls -l -d ~/`; 
#print "\n path is $path"; 
($user) = ($path=~/\.*\s+(\w+)\susers/); 

この例では、すべてのものを保存しようとしている場合、このようなものがありますか?私はわかりませんが、あなたは例として私を使うことができます。私は(\ + W)であるものは何でも保存しています:

($link) = ($html_data =~ (m/<iframe id="pdfDocument" src=.(.*)pdf/g)); 
関連する問題