Каков объем от 1 до 9 долларов в Perl? - PullRequest
5 голосов
/ 27 июня 2009

Каков охват от $1 до $9 в Perl? Например, в этом коде:

sub bla {
    my $x = shift;
    $x =~ s/(\d*)/$1 $1/;
    return $x;    
}

my $y;

# some code that manipulates $y

$y =~ /(\w*)\s+(\w*)/;

my $z = &bla($2);
my $w = $1;

print "$1 $2\n";

Что будет $1? Это будет первый \w* из $x или первый \d* из второго \w* в $x?

Ответы [ 3 ]

17 голосов
/ 27 июня 2009

из perldoc perlre

Нумерованные переменные соответствия ($ 1, $ 2, $ 3 и т. Д.) И связанный с ними набор знаков препинания ($ +, $ &, $ `, $ 'и $ ^ N) все динамически ограничиваются до конца вложенного блок или до следующего успешного матча, в зависимости от того, что наступит раньше. (См. «Сложные заявления» в perlsyn.)

Это означает, что при первом запуске регулярного выражения или замещения в области создается новая local измененная копия. Исходное значение восстанавливается (& larara; la local), когда заканчивается область. Таким образом, $1 будет равен 10 до тех пор, пока регулярное выражение не будет запущено, 20 после регулярного выражения и 10 снова после завершения подпрограммы.

Но я не использую переменные регулярных выражений вне подстановок. Я нахожу гораздо яснее говорить такие вещи, как

#!/usr/bin/perl

use strict;
use warnings;

sub bla {
    my $x = shift;
    $x =~ s/(\d*)/$1 $1/;
    return $x;    
}

my $y = "10 20";

my ($first, $second) = $y =~ /(\w*)\s+(\w*)/;

my $z = &bla($second);
my $w = $first;

print "$first $second\n";

, где $first и $second имеют лучшие имена, которые описывают их содержание.

4 голосов
/ 27 июня 2009

Сделав пару небольших изменений в вашем примере кода:

sub bla {
    my $x = shift;
    print "$1\n";
    $x =~ s/(\d+)/$1 $1/;
    return $x;
}
my $y = "hello world9";

# some code that manipulates $y

$y =~ /(\w*)\s+(\w*)/;

my $z = &bla($2);
my $w = $1;

print "$1 $2\n$z\n";

мы получаем следующий вывод:

hello
hello world9
world9 9

показывает, что $1 ограничен динамической областью (т. Е. $1, назначенный в bla, перестает существовать в конце этой функции (но $1, назначенный из $y регулярное выражение доступно в bla, пока оно не будет перезаписано))

2 голосов
/ 27 июня 2009

Переменные будут действительны до следующей записи в поток выполнения.

Но на самом деле вы должны использовать что-то вроде:

my ($match1, match2) = $var =~ /(\d+)\D(\d+)/;

Тогда используйте $ match1 и $ match2 вместо $ 1 и $ 2, это гораздо менее двусмысленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...