将匹配的Perl正则表达式保存为变量

时间:2012-04-11 20:13:02

标签: regex perl scripting

我有一个简单的Perl正则表达式,我需要保存为变量。

如果我打印它:

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

它打印我要保存的内容,但在尝试使用以下内容保存时:

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

我得到一个'1'作为$link的值。我认为这是因为它找到了'1'匹配。但是如何保存匹配的内容呢?

4 个答案:

答案 0 :(得分:6)

注意/ g获取所有匹配项。那些不可能被置于标量中。你需要一个数组。

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

如果您只是想要第一场比赛:

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

注意parens(以及缺乏现在无用的/ g)。你需要它们在列表上下文中调用m //。

答案 1 :(得分:4)

模式的匹配子表达式保存在变量$1$2等中。您还可以获得整个匹配模式($&),但这很昂贵,应该避免

顺便说一句,这里的行为区别是标量与列表上下文的结果;你应该了解它们,它们如何不同,以及它们如何影响各种Perl表达式的行为。

答案 2 :(得分:0)

来自'perlfunc'文档:

打印列表
打印字符串或字符串列表。

所以,print m//,其中m //确定返回值为
想要(wantarray?)是一个列表
(它出现m //没有捕获组返回1或0匹配传递
或失败,其中m // g返回匹配列表)。

$link = m //只能是标量(而非列表)上下文 所以,m //返回匹配结果1(真)或0(假)。

答案 3 :(得分: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));