my $line = "file1.gz file2.gz file3.gz";
my @abc = split('', $line);
print "@abc\n";
预期产出:
file1.gz
file2.gz
file3.gz
我希望file1.gz
中的$abc[0]
,file2.gz
中的$abc[1]
和file3.gz
中的$abc[2]
输出为$line
。如何拆分{{1}}?
答案 0 :(得分:15)
按空格拆分字符串非常简单:
print $_, "\n" for split ' ', 'file1.gz file1.gz file3.gz';
这实际上是split
的一种特殊形式(因为这个函数通常采用模式而不是字符串):
作为另一个特例,
split
模拟了默认行为 当省略awk
或文字时,命令行工具PATTERN
由单个空格字符组成的字符串(例如' '
或"\x20"
)。在这种情况下,EXPR
中的任何前导空格都是 在拆分发生之前删除,而PATTERN
则被视为 如果是/\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;
答案 1 :(得分:10)
现在使用$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
我更喜欢将()
用于split
,print
和for
。
答案 2 :(得分:-1)
只需使用/ \ s + /对''作为分割器。在这种情况下,所有“额外”空白都被删除。通常这种特殊行为是必需的。所以,在你的情况下,它将是:
my $line = "file1.gz file1.gz file3.gz";
my @abc = split(/\s+/, $line);
for my $i in (@abc) {
print "$i\n";
}
答案 3 :(得分:-1)
我觉得这个很简单!
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 regular expression的更多信息,并向下滚动到更多匹配部分。
答案 4 :(得分:-1)
您已经有多个问题的答案,但我想在这里添加另一个可能有助于添加内容的次要答案。
要在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;