奇怪的perl行为。 Slurp与作业

时间:2014-12-09 21:24:16

标签: regex perl scalar slurp

我在perl中碰到了一些奇怪的东西,我以为我会分享。我有一个名为" testfile.txt"。

的文本文件

这是......

BLAH BLAH BLAH BLAH BLAH
The dollar amount is $2.30 today
BLAH BLAH BLAH BLAH BLAH

现在我要提取2.30。在我下面的例子中,我正在啜饮文件,它工作正常。第二种方式根本不起作用。在啜食中是否有一些魔力?

#!/usr/local/bin/perl

## THIS WORKS
my $content;
my $filename = "testfile.txt";
my $fh="FILEIN";
open(my $fh, '<', $filename) or die "cannot open file $filename";
{
   local $/;
   $content = <$fh>;
}
close($fh);
my $price;
($price)=$content=~m{is\s\$([0-9]{1,2}\.[0-9]{2})\stoday};
print "Result is $price\n"; #Correctly produces 2.30

## DOESN'T WORK

$content2="BLAH BLAH BLAH BLAH BLAH The dollar amount is $2.30 today BLAH BLAH BLAH BLAH BLAH";
my $price2;
($price2)=$content2=~m{is\s\$([0-9]{1,2}\.[0-9]{2})\stoday};
print "Result is $price2\n"; #Doesn't work

注意:(澄清)。如何从作业示例中提取2.30?在我的真实世界应用程序中,我被困在哪里。有人知道我是如何提取的吗? JW

1 个答案:

答案 0 :(得分:5)

$content2="BLAH BLAH BLAH BLAH BLAH The dollar amount is $2.30 today BLAH BLAH BLAH BLAH BLAH"

由于字符串是双引号,$2被Perl变量$2的值替换 - 这是上一个正则表达式匹配的第二个带括号的子表达式的内容,但是&重要的是,它不是你想要的。改为使用单引号:

$content2='BLAH BLAH BLAH BLAH BLAH The dollar amount is $2.30 today BLAH BLAH BLAH BLAH BLAH'