如何在perl中使用拆分时避免未初始化的值?

时间:2013-09-23 09:07:17

标签: regex perl

我有以下代码

my $string = "My mother-in-law lives in Europe";
my @words = split(/(-)|\s+/, $string);

我希望结果类似于Mymother-in-law,{{1} },livesin,但我收到此错误

Europe,当我尝试使用foreach打印数组时。

现在,我正在使用print

Use of uninitialized value $_ in string

通过修改split语句本身是否有更好的解决方案?

4 个答案:

答案 0 :(得分:3)

由于您希望在if之后避免使用print部分,因此可以使用正则表达式模式,如下面的代码所示:

my $string = "My mother-in-law lives in Europe";
my @words = split(/(?<=-)|(?=-)|\s+/, $string);

foreach  (@words){
    print "$_" , "\n";
}

这将拆分为空字符串,后跟-或前面跟-,以及空格。因此,将-作为单独的元素,并避免捕获的组。

<强>输出:

My
mother
-
in
-
law
lives
in
Europe

答案 1 :(得分:3)

这对我有用:

#!/usr/bin/perl
use warnings;
use strict; 

my $string = "My mother-in-law lives in Europe";

my @words = split('(-)|\s+', $string); # Not capturing space

foreach  (@words){
    print "$_" , "\n" if $_;
}

输出:

My
mother
-
in
-
law
lives
in
Europe

答案 2 :(得分:2)

这是由您提供拆分的正则表达式中的捕获组引起的,可以使用Data::Dumper清楚地看到。

perl -MData::Dumper -e 'my $string = "My mother-in-law lives in Europe"; 
  my @words = split(/(-)|\s+/, $string); print Dumper(\@words);'

$VAR1 = [
      'My',
      undef,
      'mother',
      '-',
      'in',
      '-',
      'law',
      undef,
      'lives',
      undef,
      'in',
      undef,
      'Europe'
    ];

您可以使用两种方法:

  1. 使用grep从数组中删除undef。

    grep defined, split /(-)|\s+/, $string;
    
  2. 使用拆分两次,首先是空格,其次是连字符。

    map { split /(-)/ } split /\s+/, $string
    

答案 3 :(得分:0)

您还可以在分割前在连字符之间添加空格,以确保它们被视为单个字段。

#!/usr/bin/perl
use strict;
use warnings;

my @my_line = ("My mother-in-law lives in Europe");

foreach (@my_line) {
    s/-/ - /g;
    print "$_\n" foreach split;
}

<强>输出

My
mother
-
in
-
law
lives
in
Europe

请注意,您还可以使用切片来获取所需的字段。

#!/usr/bin/perl
use strict;
use warnings;

my $string = "My mother-in-law lives in Europe";

print "$_\n" foreach (split /(-)|\s+/, $string)[0, 2 .. 6, 8, 10, 12];