我是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
因此,当我阅读文档时,我假设我的变量将被视为文字字符串,而实际上它不是,因此领先的空白没有被删除。
答案 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中,这个特殊情况仅限于使用普通的“”作为split的模式参数,在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];