-1

这段代码到底在做什么,s*在perl中是什么意思,有没有其他方法可以写出这段代码。

my $group = join('","', split(/,\s*/, $tmp[4]))
4

4 回答 4

7

,\s*是一种正则表达式模式,它匹配以逗号 ( ,) 开头后跟零个或多个 ( *) 空格字符 ( \s) 的字符串。

split使用此模式来确定要在哪个分隔符上进行拆分。例如,使用该模式,它会将字符串拆分foo,bar, baz为三个字符串foo和。barbaz

以下是 Perl 5.14.2 和 Unicode 6.0.0 考虑的空格字符:

  • U+00009 字符表
  • U+0000A 换行 (LF)
  • U+0000C 换页 (FF)
  • U+0000D 回车 (CR)
  • U+00020 空间
  • U+00085 下一行 (NEL)
  • U+000A0 无间断空间
  • U+01680 欧格姆空间标记
  • U+0180E 蒙古语元音分隔符
  • U+02000 EN QUAD
  • U+02001 EM 四边形
  • U+02002 EN 空间
  • U+02003 电磁空间
  • U+02004 每 EM 三个空间
  • U+02005 4-PER-EM 空间
  • U+02006 6-PER-EM 空间
  • U+02007 人物空间
  • U+02008 标点空格
  • U+02009 薄空间
  • U+0200A 头发空间
  • U+02028 行分隔符
  • U+02029 段落分隔符
  • U+0202F 狭窄的无间断空间
  • U+0205F 中数学空间
  • U+03000 表意空间
于 2013-02-17T21:13:59.697 回答
1

假设您的代码在可编译时如下所示:

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 含义的括号中加上括号。

于 2013-02-17T21:22:13.663 回答
1

这是您上一个问题的答案中这一行的一部分

my $group = join('","',split(/,\s*/,$tmp[4]))

我认为最好写成

my $group = join ', ', map qq{"$_"}, $tmp[4] =~ /[^\s,]/g;

正则表达式提取不是空格或逗号的所有字符组,因此当应用于字符串时TTT, TTC,结果是TTTand TTC。在map每个项目周围放置双引号。并将join它们全部连接成一个字符串,用 . 分隔,。这给"TTT", "TTC"

你读过我对你前两个问题的回答吗?唯一的问题似乎是您不想安装模块,我已经为这种情况编写了一个替代方案。

于 2013-02-17T21:37:13.223 回答
0

我同意 Rohl Jain 的观点。它是一个代码片段。我想出了案例。

my $line = 'a,b, c,  d,e';
my $newline = '"'.join('","',split(/,\s*/,$line)).'"';
print $newline;

这是输出。"a","b","c","d","e"

它采用逗号分隔的一行数据,删除空格填充,并创建一个逗号分隔和双引号封装的行。注意我在行首和行尾添加了双引号。

于 2013-02-17T21:50:09.277 回答