2010-04-29 3 views
3

Что такое $1? Разве что матч найден для (\d+)?

$line =~ /^(\d+)\s/; 
next if(!defined($1)) ; 
$paperAnnot{$1} = $line; 
+2

Потому что здесь не упоминается в другом месте, пожалуйста, посетите страницу perldoc perlre для получения дополнительной информации. – kbenson

+0

В 'perldoc perlvar' есть еще более интересная информация. // Не заметил, что это уже было сделано. – ZyX

ответ

4

вы правы, $1 означает первый захват группу, в вашем примере, который (\d+)

2

Да, все, что захваченное в скобках относятся к $ 1, $ 2, $ 3 ... и т.д. магическим переменным. Если регулярное выражение не совпадает, они не будут определены.

3

Да! Это групповой матч. Увидев next, он, вероятно, находится в цикле. Тем не менее, лучший способ обработки, что вы должны были бы использовать условное и проверить регулярное выражение:

if ($line =~ /^(\d+)\s/) { 
    $paperAnnot{$1} = $line; 
} 

или даже лучше, дать $ 1 имя, чтобы сделать его документирован:

if ($line =~ /^(\d+)\s/) { 
    my $index = $1; 
    $paperAnnot{$index} = $line; 
} 

Кроме того, вы можете найти более подробную информацию о $1 и ее братьях в perldoc perlvar.

И теперь в Perl 5.10 и новее, вы можете использовать именованный захват группы:

use 5.010; # or newer 
... 
if ($line =~ /^(?<linenum>\d+)\s/) { 
    $paperAnnot{ $+{linenum} } = $line; 
} 

Подробнее об именованных группах Захвата с perldoc perlre.