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字符类中的匹配,我会假设这 是空格。我错过了什么吗?
您正在按空格字符进行分割,后跟换行符。当遇到任何一个时要分裂,有
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)
我的代码在换行符处分裂(好)
您的代码不会在换行符上拆分;看起来只是因为你打印东西的方式。您的数组包含一个元素,而不是两个。该元素中间有一个换行符,您只需打印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)