2011-05-06 27 views
1

我試圖把下面幾行填充自動Perl的變量使用量詞

 5474c2ef012a759a c11ab88ae8daa276 63693b53799c91f1 be1d8c8738733d80 

if(/[[:xdigit:]{8}[:xdigit:]{8}\s]{4}/) 

匹配反正我有填充自動變量$ 1,$ 2,$ 3 .. $ 8等與這些詞的每一個的一半。 即

$1=5474c2ef 
    $2=012a759a 
    $3=c11ab88a 
    $4=e8daa276 
    $5=63693b53 
    $6=799c91f1 
    $7=be1d8c87 
    $8=38733d80 

回答

0
use strict; 
use warnings; 
use Data::Dumper; 

$_ = '5474c2ef012a759a c11ab88ae8daa276 63693b53799c91f1 be1d8c8738733d80 '; 

if (/((?:[[:xdigit:]]{16}\s){4})/) { 
    my @nums = map { /(.{8})(.{8})/ } split /\s/, $1; 
    print Dumper(\@nums); 
} 

__END__ 

$VAR1 = [ 
      '5474c2ef', 
      '012a759a', 
      'c11ab88a', 
      'e8daa276', 
      '63693b53', 
      '799c91f1', 
      'be1d8c87', 
      '38733d80' 
     ]; 
+0

一個更簡單一線解決方案? ;) – Jean 2011-05-06 00:39:34

+0

除了'if',只有一行。 – toolic 2011-05-06 00:46:46

1

你可以在一個陣列捕捉它們:

use strict; 
use warnings; 
use Data::Dumper; 

$_ = '5474c2ef012a759a c11ab88ae8daa276 63693b53799c91f1 be1d8c8738733d80 '; 

my @nums = /\G(?:([[:xdigit:]]{8})([[:xdigit:]]{8})\s)/g; 
if (@nums >= 8) { 
    print Dumper(\@nums); 
} 

(行爲可能比原來的不同,如果有四個以上或者更早出現是16六角形不僅僅是一個空格分隔的數字序列)。

+0

我真的很不喜歡'Data :: Dumper'。 – tchrist 2011-05-06 00:47:43

+0

@tchrist:爲什麼? – ysth 2011-05-06 00:54:09

+0

因此我不使用它。 (*因此*表示「這就是爲什麼」或「等等」) – tchrist 2011-05-06 00:55:03

0

是的,有,但你不想。

你只是想這樣做:

while (/(\p{ahex}{8})/g) { print "got $1\n" } 
+0

我想:)因爲我打算計算$ 1 + $ 8,$ 2 + $ 7等 – Jean 2011-05-06 00:56:30

+0

好吧,然後說'@nums =/\ p {ahex} {8}/g',然後你有你的套餐, ($ num [0])+ hex($ num [7])','hex($ num [1])+ hex($ num [6])','hex( $ num [2])+十六進制($ num [5])'和十六進制($ num [3])+十六進制($ num [4])'' - 假設這些是你想要的組合。等等,你的意思是字符串連接算術總和? – tchrist 2011-05-06 00:58:27

1

如何:

my $pat = '([[:xdigit:]]{8})\s?' x 8; 
# produces: ([[:xdigit:]]{8})\s?([[:xdigit:]]{8})\s?.... 
/$pat/; 

更新如果你需要嚴格的間隔要求:

my $pat = join('\s', map{'([[:xdigit:]]{8})' x 2} (1..4)); 
# produces: ([[:xdigit:]]{8})([[:xdigit:]]{8})\s.... 
/$pat/;