我是Perl的新手。
我如何解释这个Perl语句?:
my( $foo, $bar ) = split /\s+/, $foobar, 2;
我知道局部变量是由split函数同时分配的,但是我不明白整数2是什么 - 我猜func会返回一个包含两个元素的数组吗?
Perl monger可以向我解释上述声明(ELI5)
此外,有时,被拆分的字符串不包含预期的标记,导致foo或bar未初始化,因此当尝试在代码中进一步使用它们时会发出警告。
如果拆分“失败”返回两个字符串,如何将$ foo和$ bar初始化为合理值(空字符串)?
答案 0 :(得分:4)
split
函数有三个参数:
匹配分隔符的正则表达式,或者特殊值" "
(由单个空格组成的字符串),它修剪字符串,然后在/\s+/
这样的空白处拆分。
应拆分的字符串。
结果片段的最大数量。有时这是对所有字段不感兴趣的优化,有时您不希望在每个分隔符处进行拆分,就像这里的情况一样。
因此,您的split
表达式最多会返回两个字段,但不一定只返回两个字段。要为变量提供默认值,请在split
之前指定默认值,或在undef
之后检查它们是split
,并提供默认值:
my ($foo, $bar) = ('', '');
($foo, $bar) = split ...;
或合并
(my ($foo, $bar) = ('', '')) = split ...
或
my ($foo, $bar) = split ...;
$_ //= '' for $foo, $bar;
如果LHS为//=
,undef
运算符会在RHS上分配值。 for
循环只是缩短代码的一种方法。
您可能还希望仅在生成两个字段时继续使用一段代码:
if ( 2 == (my ($foo, $bar) = split ...) ) {
say "foo = $foo";
say "bar = $bar";
} else {
warn "could not split!";
}
标量上下文中的列表赋值评估为分配的元素数。
答案 1 :(得分:1)
2是拆分返回的最大组件数。
因此,正则表达式/\s+/
在空白块上分割$foobar
,但只会拆分一次,以构成两个组件。如果没有空格,那么$ bar将是未定义的。
请参阅http://perldoc.perl.org/functions/split.html
除了amon的方法之外,Perl还有一个defined(x)
函数,它返回true或false,具体取决于它的参数x
是定义的还是未定义的,并且可以在if
中使用用于纠正某些内容未定义的情况的声明。
答案 2 :(得分:0)
如上所述:http://perldoc.perl.org/functions/split.html
“如果指定LIMIT且为正,则表示EXPR可以分割到的最大字段数;”
例如:
#!/opt/local/bin/perl
my $foobar = "A B C D";
my( $foo, $bar ) = split /\s+/, $foobar, 2;
print "\nfoo=$foo";
print "\nbar=$bar";
print "\n";
输出:
foo=A
bar=B C D