我有以下代码
my $string = "My mother-in-law lives in Europe";
my @words = split(/(-)|\s+/, $string);
我希望结果类似于My
,mother
,-
,in
,-
,law
,{{1} },lives
,in
,但我收到此错误
Europe
,当我尝试使用foreach打印数组时。
现在,我正在使用print
Use of uninitialized value $_ in string
通过修改split语句本身是否有更好的解决方案?
答案 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'
];
您可以使用两种方法:
使用grep
从数组中删除undef。
grep defined, split /(-)|\s+/, $string;
使用拆分两次,首先是空格,其次是连字符。
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];