Split() 在换行符和空格字符上?

Pet*_*ete 3 perl whitespace split removing-whitespace

我想split()在两个换行符上都有一个字符串空格字符的字符串:

#!/usr/bin/perl
use warnings;
use strict;

my $str = "aa bb cc\ndd ee ff";
my @arr = split(/\s\n/, $str);     # Split on ' ' and '\n'
print join("\n", @arr);            # Print array, one element per line
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

aa bb cc
dd ee ff
Run Code Online (Sandbox Code Playgroud)

但是,我想要的是这样的:

aa
bb
cc
dd
ee
ff
Run Code Online (Sandbox Code Playgroud)

所以我的代码在换行符上分裂(好),但不在空格上。 根据 perldoc,空格应该与\s字符类中的匹配,我会假设这 是空格。我错过了什么吗?

ike*_*ami 7

您正在按空格字符进行分割,后跟换行符。当遇到任何一个时要分裂,有

split /[\s\n]/, $str
Run Code Online (Sandbox Code Playgroud)

\s包括\n,因此可以简化。

split /\s/, $str
Run Code Online (Sandbox Code Playgroud)

但是如果连续有两个空格怎么办?当遇到一系列空格时,您可以进行拆分。

split /\s+/, $str
Run Code Online (Sandbox Code Playgroud)

您可以提供一个特殊的输入,它可以执行相同的操作,只是它会忽略前导空格。

split ' ', $str
Run Code Online (Sandbox Code Playgroud)

所以,

use v5.14;
use warnings;

my $str = "aa bb cc\ndd ee ff";
my @arr = split ' ', $str;
say for @arr;
Run Code Online (Sandbox Code Playgroud)

  • `split ' ', $arr` 绝对是最优雅的选择,但是 `split /[\s\n]+/, $arr` 对于我们新手来说可能更清晰一点。 (2认同)

too*_*lic 5

我的代码在换行符处分裂(好)

您的代码不会在换行符上拆分;看起来只是因为你打印东西的方式。您的数组包含一个元素,而不是两个。该元素中间有一个换行符,您只需打印aa bb cc\ndd ee ff.

\s\n表示:任何空格后跟换行符,其中空格实际上包括\n.

改变:

my @arr = split(/\s\n/, $str);
Run Code Online (Sandbox Code Playgroud)

到:

my @arr = split(/\s/, $str);
Run Code Online (Sandbox Code Playgroud)

使用Data::Dumper可以清楚地看出数组现在有 6 个元素:

use warnings;
use strict;
use Data::Dumper; 

my $str = "aa bb cc\ndd ee ff";
my @arr = split(/\s/, $str);
print Dumper(\@arr);
Run Code Online (Sandbox Code Playgroud)

印刷:

$VAR1 = [
          'aa',
          'bb',
          'cc',
          'dd',
          'ee',
          'ff'
        ];
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于您提供的输入字符串。使用以下方法分割多个连续的空格也很常见:

my @arr = split(/\s+/, $str);
Run Code Online (Sandbox Code Playgroud)