以下是Perl可以做的许多很酷的事情之一
my ($tmp) = ($_=~ /^>(.*)/);
它在循环中的当前行中找到模式^>。*,并将它存储在$ tmp变量的括号中。
我很好奇的是这种语法背后的概念。如何以及为什么(在什么前提下)这有效? 我的理解是片段$ _ =〜/ ^>(。*)/是一个布尔上下文,但括号将其呈现为列表上下文?但是,为什么只有匹配模式中括号中的内容存储在变量?!
中这是变量作业的某种特殊情况,我必须“记住”或者这可以完全解释吗?如果是这样,这个功能叫什么(名称如“autovivifacation?”)
答案 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方法来确定上下文一样。