你能解释perl中依赖于上下文的变量赋值吗?

时间:2012-04-26 20:59:46

标签: perl variables syntax variable-assignment

以下是Perl可以做的许多很酷的事情之一

my ($tmp) = ($_=~ /^>(.*)/);

它在循环中的当前行中找到模式^>。*,并将它存储在$ tmp变量的括号中。

我很好奇的是这种语法背后的概念。如何以及为什么(在什么前提下)这有效? 我的理解是片段$ _ =〜/ ^>(。*)/是一个布尔上下文,但括号将其呈现为列表上下文?但是,为什么只有匹配模式中括号中的内容存储在变量?!

这是变量作业的某种特殊情况,我必须“记住”或者这可以完全解释吗?如果是这样,这个功能叫什么(名称如“autovivifacation?”)

3 个答案:

答案 0 :(得分:5)

有两个赋值运算符:列表赋值和标量赋值。选择是根据“=”的LHS确定的。 (here详细介绍了这两个运算符。)


在这种情况下,使用列表赋值运算符。列表赋值运算符在列表上下文中计算其两个操作数。

那么$_=~ /^>(.*)/在列表上下文中做了什么?引用perlop

如果未使用/g选项,则列表上下文中的m//将返回一个列表,其中包含与模式中括号匹配的子表达式,即($1,{{1 },$2 ...)[...]当模式中没有括号时,返回值是成功列表$3。无论有没有括号,都会在失败时返回一个空列表。

换句话说,

(1)

相当于

my ($match) = $_ =~ /^>(.*)/;

如果省略了parens(my $match; if ($_ =~ /^>(.*)/) { $match = $1; } else { $match = undef; } ),则会使用标量赋值。标量赋值运算符在标量上下文中计算其两个操作数。

那么my $tmp = ...;在标量上下文中做了什么?引用perlop

如果成功则返回true,如果失败则返回false。

换句话说,

$_=~ /^>(.*)/

相当于

my $matched = $_ =~ /^>(.*)/;

答案 1 :(得分:2)

搜索模式中的括号使其成为“组”。 $_ =~ /regex/返回的是所有匹配组的数组,因此my ($tmp)将第一组抓取到$ tmp。

答案 2 :(得分:1)

perl中的所有操作都有一个返回值,包括赋值。这就是为什么你可以$a=$b=1并将$a设置为$b=1的结果。

您可以在布尔(井,标量)上下文中使用=~,但这只是因为如果没有匹配则返回空列表/ undef,并且评估为false 。在数组上下文中调用它会返回一个数组,就像其他上下文相关的函数可以使用wantarray方法来确定上下文一样。