11
my $line = "file1.gz file2.gz file3.gz";
my @abc = split('', $line);
print "@abc\n";

预期输出:

file1.gz
file2.gz
file3.gz

我希望输出为file1.gzin $abc[0]file2.gzin$abc[1]file3.gzin $abc[2]。我该如何拆分$line

4

5 回答 5

21

用空格分割字符串非常简单:

print $_, "\n" for split ' ', 'file1.gz file1.gz file3.gz';

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

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


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

也许您想拆分.gz扩展名:

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

在这里,我使用了(?<=...)构造,即look-behind assertion.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;
于 2013-06-01T11:50:24.233 回答
12

有了$line现在,您可以根据至少一个空格分隔符简单地拆分字符串

my @answer = split(' ', $line); # creates an @answer array

然后

print("@answer\n");               # print array on one line

或者

print("$_\n") for (@answer);      # print each element on one line

我更喜欢使用()forsplit和.printfor

于 2013-06-01T12:10:21.220 回答
1

只需使用 /\s+/ 反对 '' 作为拆分器。在这种情况下,所有“额外”的空白都被删除了。通常需要这种特殊行为。因此,在您的情况下,它将是:

my $line = "file1.gz file1.gz file3.gz";
my @abc = split(/\s+/, $line);
于 2015-04-05T18:06:05.353 回答
0

我发现这个非常简单!

my $line = "file1.gz file2.gz file3.gz";

my @abc =  ($line =~ /(\w+[.]\w+)/g);

print $abc[0],"\n";
print $abc[1],"\n";
print $abc[2],"\n";

输出:

file1.gz 
file2.gz 
file3.gz

在这里查看本教程以了解有关Perl 正则表达式的更多信息并向下滚动到更多匹配部分。

于 2018-02-26T06:50:18.700 回答
0

您的问题已经有多个答案,但我想在这里添加另一个小问题,这可能有助于添加一些内容。

要查看 Perl 中的数据结构,您可以使用Data::Dumper. 要打印一个字符串,您可以使用,它在每次调用后say添加一个换行符,而不是显式添加它。"\n"

我通常使用\s与空白字符匹配的。如果添加+它匹配一个或多个空白字符。你可以在这里阅读更多关于它的信息perlre

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

use feature 'say';

my $line = "file1.gz file2.gz file3.gz";
my @abc  = split /\s+/, $line;

print Dumper \@abc;
say for @abc;
于 2018-02-27T11:07:17.143 回答