我有一个简单的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 :(得分: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));