2014-10-10 47 views
0

我正在使用curl將網站存儲爲變量$ mystring。我將如何返回以「810」開頭的每個8位數字?Perl:返回所有正則表達式的實例

我目前有:

#!/usr/local/bin/perl 
my $curl = `curl ...`; 
$curl =~ /(810\d+)/; 
print "$1\n"; 

除了這僅返回第一個實例。我將如何返回所有實例並將其存儲在數組中?

回答

0

您需要使用全局修飾符/g來捕獲所有匹配。

要搜索以810開頭的8位數字,請使用\b來匹配單詞邊界,並指定要使用大括號搜索的位數; \d{5}匹配5位數字。

要存儲的比賽在一個數組,你可以做到以下幾點:

my @numbers = ($curl =~ /\b810\d{5}\b/g); 
0

使用/g修改在while循環:

my @numbers; 
while ($curl =~ /(810\d{5})/g) { 
    push @numbers, $1; 
} 
print "@numbers\n"; 

爲了找到8位數字,搜索前綴後有5位數字。此外,如果您不想匹配較大數字的部分,請檢查單詞界限(\b),或者查看非數字前後的內容。

1

使用/g Modifier

注意,如果你不是一個正則表達式的專家,一個可能的解決方案是拉出來的所有號碼,然後過濾掉你不希望像這樣的:

#!/usr/bin/env perl 
use strict; 
use warnings; 

my $curl = do {local $/; <DATA>}; 

my @nums = grep {length == 8 && /^810/} $curl =~ /\d+/g; 

print $_, "\n" for @nums; 

__DATA__ 
Hello world 
1        # Too_short 
134        # Too_short 
123456789      # Too_long 
81# Pass Too_long  Pass 
81098765 81098765 181098765  # Pass Test_repeat Too_long_with_substring 

輸出:

my @nums = $curl =~ /(?<!\d)(810\d{5})(?!\d)/g; 
81
81011111 
81098765 
81098765 

然而,同樣可以在過程的單個正則表達式來完成