Perl使用基于字符串的分隔符拆分字符串

时间:2015-01-09 15:57:03

标签: regex perl variables split delimiter

我是Perl的新手,但根据我读过的文档,看起来Perl中的split函数要求使用正则表达式而不是字符串分隔符作为第一个参数,但我发现使用print +(split(' ', $string))[0]之类的东西仍会正确分割字符串。

基于此,我试图使用变量分隔符(例如print +(split($var, $string))[0]其中$var = ' ')并发现它不起作用。我做错了什么?

谢谢!

编辑: 抱歉这个可怕的问题。我在带有前导空格的字符串上运行它,发现split函数不喜欢前导空格。例如:

my $var = ' '; print +(split($var, ' abc ddddd'))[0] 给出一个空白输出。 $ var在split函数中被解释为/$var/吗?

print +(split(' ', ' abc ddddd'))[0] 它给出了abc

的输出

因此,当我阅读文档时,我假设我的变量将被视为文字字符串,而实际上它不是,因此领先的空白没有被删除。

2 个答案:

答案 0 :(得分:7)

说明

分割文字空间时

split ' '

您调用the documentation中描述的特殊情况。使用变量时

my $var = ' ';
split $var;

将该变量放在正则表达式中是相同的:

split /$var/;

这将拆分为单个空格,而不是同一个空格。例如,如果您有此代码:

my $string = "foo bar   baz";
my @literal = split ' ', $string;
my @space = split / /, $string;

然后@literal将包含"foo", "bar", "baz"@space将包含"foo", "bar", "", "", "baz" - 空字段,它在单个空格中分割。


文档

这是文档描述它的方式:

  

作为另一种特殊情况,当省略PATTERN或由单个空格字符组成的文字字符串(例如''或“\ x20”,但不是例如/)时,split会模拟命令行工具awk的默认行为/)。在这种情况下,EXPR中的任何前导空格都会在拆分发生之前被删除,而PATTERN则被视为/ \ s + /;特别是,这意味着任何连续的空格(不只是单个空格字符)都用作分隔符。但是,通过指定模式/ /而不是字符串“”可以避免这种特殊处理,从而只允许单个空格字符作为分隔符。在早期的Perls中,这个特殊情况仅限于使用普通的“”作为sp​​lit的模式参数,在Perl 5.18.0及更高版本中,这种特殊情况由任何表达式触发,该表达式的结果为简单字符串“”。

解决方法

请注意,如果您正在寻找一种通过使用变量动态模拟' '拆分的方法,则可以改用/\s+/。它并不完全相同,因为它不会剥离前导空格,否则应该按预期工作。

答案 1 :(得分:0)

你的代码工作正常,我想

my $text = "botolo";
my $separator = "o";
print +(split($separator, $text))[0];  
#uglyness with + necessary because Perl

虽然以一个额外的行为代价,但我宁愿将最后一行写为:

my @parts = split($separator, $text);
print $parts[0];