我正在学习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");
谢谢。
答案 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