我通过两种方式使用了分割功能。第一种方式:
my $string="chr1.txt";
my @array1=split(".",$string);
print $array1[0];
我收到此错误:Use of uninitialized value in print
当我通过第二种方式进行分割时,我没有任何错误。
my @array1=split(/\./,$string);print $array1[0];
我的第一种分裂方式不仅适用于点。
有人可以解释一下这背后的原因吗?
答案 0 :(得分:9)
"\."
只是.
,小心转义序列。
如果您想在双引号字符串中使用反斜杠和点,则需要"\\."
。或者使用单引号:'\.'
答案 1 :(得分:6)
如果您只是想解析文件并获取其后缀,请更好地使用File::Basename
中的fileparse()
方法
答案 2 :(得分:3)
@Mat提供的信息的其他详细信息:
在split "\.", ...
中,split
的第一个参数在传递给正则表达式引擎之前首先被解释为双引号字符串。正如Mat在双引号字符串中所说,\
是转义字符,意思是“从字面上理解下一个字符”,例如比如在双引号字符串中放置双引号:"\""
因此,您的split
作为模式传递"."
。单个点表示“拆分任何字符”。如您所知,分割模式本身不是结果的一部分。所以你有几个空字符串作为结果。
但为什么第一个元素未定义而不是空?答案在于split
的文档:如果你没有对split
(它的第三个参数)返回的元素数量施加限制,那么它将默默地从结尾处删除空结果。名单。由于所有项都为空,因此列表为空,因此第一个元素不存在且未定义。
您可以看到与此特定代码段的区别:
my @p1 = split "\.", "thing";
my @p2 = split "\.", "thing", -1;
print scalar(@p1), ' ', scalar(@p2), "\n";
输出0 6
。
然而,@ soulSurfer2010在他的帖子中所说的“正确”处理这个问题的方法。