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

Rya*_*ley 0 regex variables perl split delimiter

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

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

谢谢!

编辑:对不起这个可怕的问题.我正在对带有前导空格的字符串运行此操作,发现split函数不喜欢前导空格.例如:

my $var = ' '; print +(split($var, ' abc ddddd'))[0] 给出一个空白输出.$ var是否被解释为/$var/split函数内部?

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

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

TLP*_*TLP 7

说明

分割文字空间时

split ' '
Run Code Online (Sandbox Code Playgroud)

您调用文档中描述的特殊情况.使用变量时

my $var = ' ';
split $var;
Run Code Online (Sandbox Code Playgroud)

这是一样的把这个变量正则表达式中:

split /$var/;
Run Code Online (Sandbox Code Playgroud)

这将拆分为单个空格,而不是同一个东西.例如,如果你有这个代码:

my $string = "foo bar   baz";
my @literal = split ' ', $string;
my @space = split / /, $string;
Run Code Online (Sandbox Code Playgroud)

然后@literal将包含"foo", "bar", "baz",而且@space会包含"foo", "bar", "", "", "baz"-空字段它已经对单个空格分开.


文档

这是文档描述它的方式:

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

解决方法

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