2017-09-11 54 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; 
}