2017-09-11 53 views
-3

我有一个数组,它具有某些元素。每个元素都有两个字符“BC”,后面跟着一个数字 ,例如 - “BC6”从Perl数组中提取数字

我想提取存在的数字并将其存储在不同的数组中。

use strict; 
use warnings; 
use Scalar::Util qw(looks_like_number); 
my @band = ("BC1", "BC3"); 
foreach my $elem(@band) 
{ 
    my @chars = split("", $elem); 
    foreach my $ele (@chars) { 
     looks_like_number($ele) ? 'push @band_array, $ele' : ''; 
    } 
} 

执行后@band_array应该包含(1,3)

有人可以告诉我在做什么错?我是perl的新手,仍在学习

+0

为什么不ü尝试使用正则表达式 –

+1

不要把' '推@band_array,$ ELE''成单qoutes。这是一个字符串perl – Jens

+0

@ N.HariHaraSudhan你能告诉我一些正则表达式的链接,我可以使用它。我还没有在 –

回答

3

要用正则表达式来做到这一点,您需要一个非常简单的模式。 /BC(\d)/应该足够了。 BC是字面的。 ()捕获组。他们将比赛内部保存到变量中。第一组涉及Perl中的$1\d字符组的数字。这是0-9(和其他人,但在这里不相关)。

在你的程序中,它看起来像这样。

use strict; 
use warnings; 
use Data::Dumper; 
my @band = ('BC1', 'BC2'); 
my @numbers; 
foreach my $elem (@band) { 
    if ($elem =~ m/BC(\d)/) { 
     push @numbers, $1; 
    } 
} 

print Dumper @numbers; 

这个程序打印:

$VAR1 = '1'; 
$VAR2 = '2'; 

请注意,你的代码有几个语法错误。最主要的是你使用的是@band = [ ... ],它给你一个包含一个数组引用的数组。但是你的程序假定这个数组中有字符串。

1

首先,你的数组是一个匿名数组引用;使用()用于常规数组。

然后,我会用grep值滤除到一个新的数组

use strict; 
use warnings; 

my @band = ("BC1", "BC3"); 
my @band_array = grep {s/BC(\d+)/$1/} @band; 

$"=" , "; # make printing of array nicer 
print "@band_array\n"; # print array 

grep的工作原理是在{}传递数组中的每个元素中的代码,就像一个子例程。传递数组中每个值的$ _。如果代码返回true,那么传递后的$ _的值将放置在新数组中。

在这种情况下,如果进行替换,例如正则表达式必须匹配,s ///正则表达式返回true。这里是link关于grep的更多信息

+1

有趣,谢谢 – hoffmeister

+1

那是怎么回事?应该在技术上是正确的 – hoffmeister

+0

这样更好,谢谢。不过,这有点绕角,不是吗?它只能工作,因为'grep'别名列表元素,而's // //'操作它们。如果替换成功,它将返回'1',并且触发现在更改(由于别名)值的传递。它完成了工作,但这是一个不寻常的方法,我会说。 :-) – simbabque

1

只要您的命名包含除BC以外的其他字符,这将从您的列表中提取所有数值。

use strict; 
use warnings; 

my @band = ("AB1", "BC2", "CD3"); 
foreach my $str(@band) { 
$str =~ s/[^0-9]//g; 
print $str; 
}