Alb*_*lby 2 variables syntax perl variable-assignment
以下是Perl可以做的许多很酷的事情之一
my ($tmp) = ($_=~ /^>(.*)/);
Run Code Online (Sandbox Code Playgroud)
它在循环中的当前行中找到模式^>.*,并将它存储在$ tmp变量的括号中.
我很好奇的是这种语法背后的概念.如何以及为什么(在什么前提下)这有效?我的理解是片段$ _ =〜/^>(.*)/是一个布尔上下文,但括号将它呈现为列表上下文?但是,为什么只有匹配模式中括号中的内容存储在变量中?!
这是变量赋值的某种特殊情况,我必须"记住"或者这可以完全解释吗?如果是这样,这个功能叫什么(名称如"autovivifacation?")
有两个赋值运算符:列表赋值和标量赋值.选择是根据" =
" 的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)