3

我有一个简单的 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

4 回答 4

7

注意 /g 以获取所有匹配项。这些不可能放入标量中。你需要一个数组。

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

如果你只想要第一场比赛:

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

注意括号(以及缺少现在无用的 /g)。您需要他们在列表上下文中调用 m//。

于 2012-04-11T20:19:27.127 回答
4

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

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

于 2012-04-11T20:17:46.123 回答
0

来自“perlfunc”文档:

print LIST
打印一个字符串或字符串列表。

所以,print m//其中 m// 确定
想要的返回值(wantarray?)是一个列表
(它出现在 m// 没有捕获组的情况下返回 1 或 0 匹配通过
或失败,其中 m//g 返回匹配列表) .

$link= m// 只能是标量(相对于列表)上下文。
因此,m// 返回匹配结果 1(真)或 0(假)。

于 2012-04-11T23:02:55.047 回答
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));
于 2014-09-15T17:48:53.530 回答