繁体   English   中英

使用 Perl 按点分割

[英]Split by dot using Perl

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

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

我收到此错误:

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

当我通过第二种方式(正则表达式参数)做分裂,我没有得到任何错误。

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

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

这背后的原因是什么?

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

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

如果您只想解析文件并获取它们的后缀,最好使用File::Basenamefileparse()方法。

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 在他的帖子中所说的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM