Perl的1到9美元的范围是多少?

时间:2009-06-27 15:01:13

标签: regex perl scope

Perl中$1$9的范围是多少?例如,在此代码中:

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 个答案:

答案 0 :(得分:17)

来自perldoc perlre

  

编号的匹配变量($ 1,$ 2,$ 3等)和相关的标点符号集($ +,$&,$`,$'和$ ^ N)都是动态范围的,直到结束封闭或直到下一次成功的比赛,以先到者为准。 (参见“perlsyn”中的“复合陈述”。)

这意味着第一次在作用域中运行正则表达式或替换时,会创建新的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有更好的名称来描述其内容。

答案 1 :(得分:4)

通过对示例代码进行一些小改动:

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仅限于dynamic scope(即$1内分配的bla在该函数结束时不再存在(但{{1} $1正则表达式分配的$y可以在bla内访问,直到被覆盖))

答案 2 :(得分:2)

变量将在下次执行流程时写入有效。

但实际上,你应该使用类似的东西:

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

然后使用$ match1和$ match2而不是$ 1和$ 2,它的含义要小得多。