8

我通过两种方式使用拆分功能。第一种方式(split的字符串参数):

my $string = "chr1.txt";
my @array1 = split(".", $string);
print $array1[0];

我收到此错误:

在打印中使用未初始化的值

当我通过第二种方式进行拆分时(拆分的正则表达式参数),我没有收到任何错误。

my @array1 = split(/\./, $string); print $array1[0];

我的第一种拆分方式不仅仅适用于点。

这背后的原因是什么?

4

3 回答 3

11

"\."只是.,小心转义序列。

如果您想要双引号字符串中的反斜杠和点,则需要"\\.". 或者使用单引号:'\.'

于 2012-08-25T16:22:36.633 回答
6

如果你只是想解析文件并获取它们的后缀,最好使用fileparse()from 的方法File::Basename

于 2012-08-25T16:19:11.760 回答
3

Mat 提供的信息的其他详细信息:

split "\.", ...第一个参数中,tosplit在传递给正则表达式引擎之前首先被解释为双引号字符串。正如 Mat 所说,在双引号字符串中,a\是转义字符,意思是“按字面意思取下一个字符”,例如在双引号字符串中放置双引号:"\""

所以你的作为模式split被传递"."了。一个点表示“在任何字符上分割”。如您所知,拆分模式本身并不是结果的一部分。所以你有几个空字符串作为结果。

但是为什么第一个元素是未定义的而不是空的呢?答案在文档中split:如果您不对split(其第三个参数)返回的元素数量施加限制,那么它将默默地从列表末尾删除空结果。由于所有项目都为空,因此列表为空,因此第一个元素不存在且未定义。

您可以看到这个特定片段的不同之处:

 my @p1 = split "\.", "thing";
 my @p2 = split "\.", "thing", -1;
 print scalar(@p1), ' ', scalar(@p2), "\n";

它输出0 6.

然而,处理这个问题的“正确”方法是@soulSurfer2010 在他的帖子中所说的。

于 2012-08-25T17:31:48.973 回答