1

次の行に一致させようとしていました

      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
4

4 に答える 4

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);
}

(4つを超える場合、またはスペースだけで区切られた以前の16進数のシーケンスがある場合は、元のシーケンスとは異なる動作をする可能性があります)。

于 2011-05-06T00:46:24.673 に答える
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 に答える
0

はい、ありますが、あなたはしたくありません。

あなたはこれをしたいだけです:

 while ( /(\p{ahex}{8})/g ) { print "got $1\n" }
于 2011-05-06T00:47:13.443 に答える
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 に答える