2010-01-11 130 views
1

我正在学习split function的示例代码。分割功能扩展

示例代码。

#!C:\Perl\bin\perl.exe 
use strict; 
use warnings; 

my $info = "Caine:Michael:Actor:14, Leafy Drive"; 
my @personal = split(/:/, $info); 
# @personal = ("Caine", "Michael", "Actor", "14, Leafy Drive"); 

如果改变$info = "Caine Michael Actor /* info data */"; 如何使用split(/ /, $info)导出结果如下。

# @personal = ("Caine", "Michael", "Actor", "info data"); 

谢谢。

+4

之间的所有内容。你试过什么了? – Ether 2010-01-11 07:45:53

+0

嗨醚,也许我发布了一个愚蠢的问题。我的项目仍然有些困难。有时我不知道如何分析我的问题,也许我已经错误地发布了我的问题。 :-)我只是尝试了错误的方式,然后我会回头寻找另一种方式。这是我非常愚蠢的学习方法。 – 2010-01-11 08:04:08

+1

是否有充分的理由使用空格作为分隔符?下面的代码示例表明模糊会造成复杂性。通常的做法是“逃避”分隔符,例如使用反斜杠 – 2010-01-11 08:10:42

回答

0

煮熟了:)。只为你工作的例子。不能一概而论

use strict; 
use warnings; 

my $info = "Caine Michael Actor /* info data */"; 
if($info=~m{/\*\s*(.*?)\s*\*/}) 
{ 
    my $temp = $1; 
    $temp=~s{\s+}{##}g; 
    $info=~s{/\*\s*(.*?)\s*\*/}{$temp}; 
} 
my @personal = split(/ /, $info); 
foreach(@personal) 
{ 
    s{##}{ }g; 
    print "$_\n"; 
} 

输出:

 
C:>perl a.pl 
Caine 
Michael 
Actor 
info data

+0

@codadict,非常感谢您的详细回复。我发现这是我的案子的解决方案。这是魔法。 – 2010-01-11 09:43:55

2

这真的是更好地使用正则表达式是:

$info = "Caine Michael Actor /* info data */"; 
$info =~ /(\w+)\s+(\w+)\s+(\w+).*\/\*(.+)\*\//; 
@personal = ($1, $2, $3, $4); 

主要是因为你的输入字符串具有与单词分隔含糊不容易被split处理。

如果你想知道如何阅读正则表达式:

/ 
    (\w+) # CAPTURE a sequence of one of more word characters into $1 
    \s+  # MATCH one or more white space 
    (\w+) # CAPTURE a sequence of one of more word characters into $2 
    \s+  # MATCH one or more white space 
    (\w+) # CAPTURE a sequence of one of more word characters into $3 
    .*  # MATCH zero or more of anything 
    \/\* # MATCH the opening of C-like comment /* 
    (.+) # CAPTURE a sequence of one or more of anything into $4 
    \*\/ # MATCH the closing of C-like comment */ 
/x 
+0

使用不同的分隔符避免倾斜的牙签综合征,并将匹配分配给“@个人”。不要忘记检查“@个人”是否被填充。 'if(@personal =〜m!...!)'。你也应该固定模式。 – 2010-01-11 10:26:50

+1

你真的不想匹配\ w +那里。只要不是空白字符(即,你不关心它们是否是Perl标识符字符),你不关心字符是什么,所以你应该匹配\ S + – 2010-01-11 10:59:40

+0

更好的是if(@personal = $ info =〜/.../){...}'。 **不要使用'$ 1'和朋友无条件!** – 2010-01-11 14:17:18

4

替代做法:

你有没有考虑采用分体式的三参数版本:

$info = "Caine Michael Actor /* info data */"; 
@personal= split(' ',$info,4); 

导致在

@personal=('Caine','Michael','Actor','/* info data */'); 

那么你就必须删除/ ** / ..让你的结果...

+1

叹气,我不能得到斜杠星号和星号斜线显示.. – lexu 2010-01-11 08:14:29

+0

嗨Lexu,感谢您的回复。我从来没有考虑过使用3参数版本的拆分。你教我更多关于split()的知识。 – 2010-01-11 09:53:17

1

,因为没有一个答案了,处理一般情况下,这里有云:

split是不是你最好的在这里下注,由于分隔符既可以是匹配字符也可以是非匹配字符,因此将问题反转并描述您所做的匹配内容(在本例中为非空格字符串)或内容交流风格的评论。

use strict; 
use warnings; 

my $info = "Caine Michael Actor /* info data */"; 
my @personal = grep {defined} $info =~ m! /\* \s* (.+?) \s* \*/ | (\S+) !xg; 

say join ', ' => @personal; 

这将返回任何您需要的序列的评论的单词/内容的列表。语法突出显示器不正确地突出显示上述正则表达式,正则表达式是!