这段代码到底在做什么,s*在perl中是什么意思,有没有其他方法可以写出这段代码。
my $group = join('","', split(/,\s*/, $tmp[4]))
,\s*
是一种正则表达式模式,它匹配以逗号 ( ,
) 开头后跟零个或多个 ( *
) 空格字符 ( \s
) 的字符串。
split
使用此模式来确定要在哪个分隔符上进行拆分。例如,使用该模式,它会将字符串拆分foo,bar, baz
为三个字符串foo
和。bar
baz
以下是 Perl 5.14.2 和 Unicode 6.0.0 考虑的空格字符:
假设您的代码在可编译时如下所示:
my $test = "abc, xyz, mno";
print join('","', split(/,\s*/, $test));
它可以重写为:
my $test = "abc, xyz, mno";
my @tokens = split /,\s*/, $test; # split $test on `,\s*`
print join '","', @tokens; # Join the array back on `","`.
regex
@ikegami 在他的回答中已经解释了这意味着什么。
请记住,您可以omit
在不改变 Perl 含义的括号中加上括号。
my $group = join('","',split(/,\s*/,$tmp[4]))
我认为最好写成
my $group = join ', ', map qq{"$_"}, $tmp[4] =~ /[^\s,]/g;
正则表达式提取不是空格或逗号的所有字符组,因此当应用于字符串时TTT, TTC
,结果是TTT
and TTC
。在map
每个项目周围放置双引号。并将join
它们全部连接成一个字符串,用 . 分隔,
。这给"TTT", "TTC"
你读过我对你前两个问题的回答吗?唯一的问题似乎是您不想安装模块,我已经为这种情况编写了一个替代方案。
我同意 Rohl Jain 的观点。它是一个代码片段。我想出了案例。
my $line = 'a,b, c, d,e';
my $newline = '"'.join('","',split(/,\s*/,$line)).'"';
print $newline;
这是输出。"a","b","c","d","e"
它采用逗号分隔的一行数据,删除空格填充,并创建一个逗号分隔和双引号封装的行。注意我在行首和行尾添加了双引号。