gpt4 book ai didi

perl - 你能解释一下 perl 中的上下文相关变量赋值吗

转载 作者:行者123 更新时间:2023-12-02 07:06:58 24 4
gpt4 key购买 nike

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

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

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

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

这是我必须“记住”的变量赋值的某种特殊情况,还是可以完美解释?如果是这样,这个功能叫什么(名字像“autovivivifacation?”)

最佳答案

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


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

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

If the /g option is not used, m// in list context returns a list consisting of the subexpressions matched by the parentheses in the pattern, i.e., ( $1, $2, $3...) [...] When there are no parentheses in the pattern, the return value is the list (1) for success. With or without parentheses, an empty list is returned upon failure.

换句话说,

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

相当于

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

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

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

returns true if it succeeds, false if it fails.

换句话说,

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

相当于

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

关于perl - 你能解释一下 perl 中的上下文相关变量赋值吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10341353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com