2013-06-01 46 views
6
my $line = "file1.gz file2.gz file3.gz"; 
my @abc = split('',$line); 
print "@abc\n"; 

预期输出:分割字符串转换成阵列在Perl

file1.gz 
file2.gz 
file3.gz 

我想要的输出为file1.gz$abc[0]file2.gz in $ ABC [1] , and file3.gz in $ ABC [2]` 。我如何拆分?

+1

好了,没有编程语言能读你的心'分裂“”'分裂成单个字符如果您所有的文件名以'˚F开始。 ile ...',然后'split /(?= file)/'可以工作,但是没有通用的解决方案 – amon

+2

@aragaer您的评论实际上是错误的。 ['split'](http://perldoc.perl.org/functions/split.html)将参数作为模式,字符串,限制。你的订单是错误的。如果'$“eq”\ n“'('$”'通常是一个空格),'print'@abc \ n“'可以正常工作。 – amon

回答

13

的开裂空白的字符串是非常简单的:

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

这是split实际上是一种特殊形式(如该功能通常需要的模式,而不是字符串):

作为另一个特例,split模仿PATTERN要么省略当 命令行工具awk的默认行为或文字串 单个空格字符组成的(如' '"\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; 
+0

问题已被更改为包含空格 – jamylak

+0

是什么?<=在上面的代码中 –

+0

@ user2384801添加了解释和链接。 – raina77ow

9

$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

+1

你应该知道默认的''''split可能是你想要的,而不是'/ \ s + /'。它们完全相同,除了在分割之前引导空白的默认条带。 – TLP

+1

@TLP非常感谢 - 总是使用'/ \ s + /'忽略默认的''''。我仍然觉得'/ \ s + /'更容易理解,因为它显示了它的内容......但是我想''很容易记住,它确实是一个人想要的东西(通常没人在意将0字符串作为第一个元素),并且无需花费昂贵的正则表达式就可以进行优化。答案已更新。 –

+0

不客气。 – TLP

0

只需使用/ \ s +/against''作为分隔符。在这种情况下,所有“额外”空白被删除。通常这种特殊行为是必需的。所以,在你的情况下它将会是:

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

for my $i in (@abc) { 
    print "$i\n"; 
} 
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 regular expression,向下滚动到更多匹配部分。

0

你好Rahul Reddy

你已经有多个解答您的问题,但我想在这里补充另一个较小的一个,可能有助于补充一下。

要查看在Perl中你可以使用Data::Dumper并打印您可以使用say一串复杂的数据结构,它的每一个字符串,而不是做手工后增加了一个新的行字符(\n)。

我通常使用(\s)符合(一)个空白字符,如果添加(+)它匹配一个或多个空格(\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); 

希望这有助于BR