拆分功能扩展

时间:2010-01-11 07:30:27

标签: perl split

我正在学习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 个答案:

答案 0 :(得分:4)

替代方法:

您是否考虑过使用拆分的3参数版本:

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

导致

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

然后你必须删除/ * * / ..才能获得结果......

答案 1 :(得分: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

答案 2 :(得分:1)

因为还没有处理一般情况的答案,所以这里是:

split不是你最好的选择,因为分隔符可以是匹配的和不匹配的字符,所以最明显的是反转问题并描述你要做什么匹配,在此case是非空格字符串,或ac风格注释的内容。

use strict;
use warnings;

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

say join ', ' => @personal;

将以您需要的任何顺序返回注释的单词/内容列表。语法高亮显示不会正确突出显示上述正则表达式,正则表达式是!

之间的所有内容

答案 3 :(得分: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