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

时间:2013-06-01 11:47:14

标签: arrays string perl split

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}}?

5 个答案:

答案 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

我更喜欢将()用于splitprintfor

答案 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;