my $line = "file1.gz file2.gz file3.gz";
my @abc = split('', $line);
print "@abc\n";
预期输出:
file1.gz
file2.gz
file3.gz
我希望输出为file1.gz
in $abc[0]
、file2.gz
in$abc[1]
和 file3.gz
in $abc[2]
。我该如何拆分$line
?
用空格分割字符串非常简单:
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;
有了$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
和.print
for
只需使用 /\s+/ 反对 '' 作为拆分器。在这种情况下,所有“额外”的空白都被删除了。通常需要这种特殊行为。因此,在您的情况下,它将是:
my $line = "file1.gz file1.gz file3.gz";
my @abc = split(/\s+/, $line);
我发现这个非常简单!
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 正则表达式的更多信息并向下滚动到更多匹配部分。
您的问题已经有多个答案,但我想在这里添加另一个小问题,这可能有助于添加一些内容。
要查看 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;