在Perl中将字符串拆分为数组

Rah*_*ddy 8 arrays string perl split

my $line = "file1.gz file2.gz file3.gz";
my @abc = split('', $line);
print "@abc\n";
Run Code Online (Sandbox Code Playgroud)

预期产量:

file1.gz
file2.gz
file3.gz
Run Code Online (Sandbox Code Playgroud)

我希望输出file1.gz$abc[0],file2.gz$abc[1]file3.gz$abc[2].我怎么拆分$line

rai*_*7ow 15

按空格拆分字符串非常简单:

print $_, "\n" for split ' ', 'file1.gz file1.gz file3.gz';
Run Code Online (Sandbox Code Playgroud)

这是split实际的一种特殊形式(因为这个函数通常采用模式而不是字符串):

作为另一种特殊情况,当省略或由单个空格字符(例如或)组成的文字字符串时,split模拟命令行工具的默认行为.在这种情况下,在拆分发生之前删除任何前导空格,而是将其视为; 特别是,这意味着任何连续的空格(不只是单个空格字符)都用作分隔符.awkPATTERN' '"\x20"EXPRPATTERN/\s+/


这是原始问题的答案(使用一个没有任何空格的简单字符串):

也许你想分手.gz扩展:

my $line = "file1.gzfile1.gzfile3.gz";
my @abc = split /(?<=\.gz)/, $line;
print $_, "\n" for @abc;
Run Code Online (Sandbox Code Playgroud)

在这里,我使用了(?<=...)构造,它是后面的断言,基本上在前面有.gz子串的行中的每个点处进行分割.

如果使用固定的扩展集,则可以扩展模式以将它们全部包含在内:

my $line = "file1.gzfile2.txtfile2.gzfile3.xls";
my @exts = ('txt', 'xls', 'gz');
my $patt = join '|', map { '(?<=\.' . $_ . ')' } @exts;
my @abc = split /$patt/, $line;
print $_, "\n" for @abc;
Run Code Online (Sandbox Code Playgroud)


Rin*_*g Ø 10

$line像现在,你可以基于至少一个空格分隔简单地分割字符串

my @answer = split(' ', $line); # creates an @answer array
Run Code Online (Sandbox Code Playgroud)

然后

print("@answer\n");               # print array on one line
Run Code Online (Sandbox Code Playgroud)

要么

print("$_\n") for (@answer);      # print each element on one line
Run Code Online (Sandbox Code Playgroud)

我喜欢用()split,printfor.

  • 你应该知道默认的'''`split可能是你想要的而不是`/\s + /`.它们完全相同,除了在拆分之前引导空格的默认条带. (2认同)