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
?
答案 0 :(得分:17)
编号的匹配变量($ 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,它的含义要小得多。