1

我试图匹配以下行

      5474c2ef012a759a c11ab88ae8daa276 63693b53799c91f1 be1d8c8738733d80 

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

无论如何,我用每个单词的一半填充自动变量 $1,$2,$3..$8 等。IE

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

4 回答 4

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/;
于 2011-05-06T01:00:26.243 回答
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 位十六进制数字序列由一个以上的空格分隔,则其行为可能与原始序列不同)。

于 2011-05-06T00:46:24.673 回答
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'
        ];
于 2011-05-06T00:34:32.170 回答
0

是的,有,但你不想。

你只想这样做:

 while ( /(\p{ahex}{8})/g ) { print "got $1\n" }
于 2011-05-06T00:47:13.443 回答