Perl Split数组结果出现未初始化值:Redhat与SUSE执行差异排查
问题分析与解决
首先直接点出核心问题:你代码里的 $type = @_[0]; 这一行完全用错了变量!
@_ 是Perl里专门用于接收子程序参数的数组,在主程序(不在任何子程序调用内部)的上下文里,@_ 是空数组,所以 @_[0] 自然就是未定义的值——这就是Redhat上 $type 输出为空的原因。
那为什么SUSE上能得到 Cat 呢?这大概率是两台机器的Perl版本或编译配置差异导致的:旧版本的Perl可能存在某个已修复的bug,或者SUSE的Perl环境开启了一些非标准的行为,意外让 @_ 被填充了 split 的结果,但这绝对不是Perl的标准行为,属于异常情况。
正确的写法
要获取split后的第一个元素,你需要把split的结果存到一个普通数组里,或者直接在列表上下文里提取:
方法1:用数组存储拆分结果
#!/usr/bin/perl my $str = "Cat|Dog|Bird"; my @split_parts = split /\|/, $str; # 列表上下文,得到拆分后的所有元素 my $number = scalar @split_parts; # 标量上下文,获取数组长度 my $type = $split_parts[0]; # 取第一个元素 print "number of args: $number and type is: $type \n";
方法2:直接在列表上下文提取第一个元素
#!/usr/bin/perl my $str = "Cat|Dog|Bird"; my $number = split /\|/, $str; # 标量上下文,获取元素个数 my ($type) = split /\|/, $str; # 列表上下文,只取第一个元素(括号让它变成列表上下文) print "number of args: $number and type is: $type \n";
额外建议
建议在Perl脚本开头加上 use strict; use warnings;,这会强制你声明变量(用my),并且在出现未初始化变量、语法错误时给出警告,能帮你快速定位这类问题,避免类似的低级错误。
内容的提问来源于stack exchange,提问作者Jet_C
相关产品推荐
相关产品推荐

