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

Alb*_*lby 2 variables syntax perl variable-assignment

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

my ($tmp) = ($_=~ /^>(.*)/);
Run Code Online (Sandbox Code Playgroud)

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

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

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

ike*_*ami 5

有两个赋值运算符:列表赋值和标量赋值.选择是根据" =" 的LHS确定的.(这里详细介绍了两个运营商.)


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

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

如果/g不使用选项,m//在列表上下文返回由以图案括号匹配的子表达式的列表,即,( ,,$1 ...)[...]当没有括号的模式,返回价值是成功的清单.有或没有括号,失败时返回一个空列表.$2$3(1)

换一种说法,

my ($match) = $_ =~ /^>(.*)/;
Run Code Online (Sandbox Code Playgroud)

相当于

my $match;
if ($_ =~ /^>(.*)/) {
    $match = $1;
} else {
    $match = undef;
}
Run Code Online (Sandbox Code Playgroud)

如果parens省略(my $tmp = ...;),则将使用标量赋值.标量赋值运算符在标量上下文中计算其两个操作数.

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

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

换一种说法,

my $matched = $_ =~ /^>(.*)/;
Run Code Online (Sandbox Code Playgroud)

相当于

my $matched;
if ($_ =~ /^>(.*)/) {
    $matched = 1;   # !!1 if you want to be picky.
} else {
    $matched = 0;   # !!0 if you want to be picky.
}
Run Code Online (Sandbox Code Playgroud)