我有一个具有某些元素的数组。每个元素都有两个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)
有人可以告诉我我做错了什么吗?我是新手,仍在学习
答案 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;
}