Заполнение автоматических переменных Perl при использовании квантификаторов - PullRequest
1 голос
/ 06 мая 2011

Я пытался сопоставить следующую строку

      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 ]

1 голос
/ 06 мая 2011

Как насчет:

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/;
1 голос
/ 06 мая 2011

Вы можете захватить их в массиве:

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 голосов
/ 06 мая 2011

Да, есть, но вы не хотите.

Вы просто хотите сделать это:

 while ( /(\p{ahex}{8})/g ) { print "got $1\n" }
0 голосов
/ 06 мая 2011
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'
        ];
...