Perl中向new函数传入split结果首个元素为何接收不到参数?
原因分析
这是Perl中split函数的默认行为和列表上下文切片的特性共同导致的:
- 当
split处理的待分割字符串为空值''时,默认会返回空列表,而非你预期的包含单个空字符串的列表。 - 函数传参属于列表上下文,你对空列表执行下标为0的切片操作
(split ',', $str)[0]时,因为不存在对应下标的元素,切片操作会返回空列表,而非undef。 - 空列表作为参数传入函数,自然不会给
@_增加任何元素,所以你看到入参数量为0。
你可以运行以下代码验证该行为:
sub check_args { print "入参数量:" . scalar @_ . "\n"; } my $str = ''; check_args( (split ',', $str)[0] ); # 输出结果为:入参数量:0
修复方案
如果你需要保证始终传入第一个分割结果,可以用以下任意一种写法:
- 调整split参数,让空字符串分割后也返回包含空元素的列表:
new( (split ',', $str, -1)[0] ); - 强制标量上下文,此时取不到元素时会返回
undef传入:new( scalar( (split ',', $str)[0] ) ); - 给缺省值,避免传入
undef:new( (split ',', $str)[0] // '' ); - 先把取值结果赋值给标量再传参:
my $first_arg = (split ',', $str)[0]; new($first_arg);
内容的提问来源于stack exchange,提问作者Eugen Konkov
相关产品推荐
相关产品推荐

