2014-12-09 3 views
0

Я столкнулся с чем-то странным в perl, который, как я думал, я бы поделился. У меня есть текстовый файл с именем «testfile.txt».Странное поведение perl. Slurp против задания

Здесь ....

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

Теперь я хочу, чтобы извлечь 2.30. В моем примере ниже, я разрываю файл, и он работает нормально. Второй способ вообще не работает. Есть ли какая-то магия в slurp?

#!/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

+7

'использование предупреждений;' дает вам подсказку. – toolic

+1

https://eval.in/232692 –

+0

mpapec, который сделал это! Именно это я и сделал. –

ответ

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' 
+0

Спасибо, Марк. Я уточнил свой вопрос выше с разъяснениями. –

+2

'$ 2' - это * second * capture – Borodin

+1

Правильно, потому что' $ 0' - 'argv [0]'. Спасибо за исправление. –