从Perl中的数组中提取数字

时间:2017-09-11 11:52:31

标签: arrays perl

我有一个具有某些元素的数组。每个元素都有两个char" BC"接下来是一个数字 例如 - " BC6"

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

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)

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

3 个答案:

答案 0 :(得分: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 :(得分:1)

首先,您的数组是匿名数组引用; use()用于常规数组。

然后,我会使用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,例如正则表达式必须匹配。有关grep

的更多信息,请参阅link

答案 2 :(得分:1)

如果您的命名包含BC以外的字符,则会从列表中提取所有数字值。

use strict;
use warnings;

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