1

キーが正規表現で、値が置換であるハッシュを作成しようとしています。同様の構造を作成し、「select * from table where $lookup RLIKE `key`」などのクエリを使用して、MySQL データベースでこれを実行しましたが、正常に動作します。perl スクリプトで同じことを試して、より効率的に実行できるかどうかを確認したいと考えています。これをループにして各キーをチェックできることはわかっていますが、それが望ましくないため、正規表現文字列を作成しました。私が理解できない唯一の部分は、一致した正規表現 (変更) の一部を返すように perl を取得する方法です...

%s = (
  '^mynumbers-(\d+)$' => 'thenumber-$1' ,
  '^myletters-([a-zA-Z])$' => 'theletter-$1'
);

#build a string of the hash keys into a regex
while (keys %s) {
  $regex_string.="($_)|";
}

#this is the input that will be looked up
$lookup = 'mynumbers-123';

if ($lookup=~/$regex_string/) {

  print "found->$lookup in the regex\n";

  $matched_regex = $i_dont_know; 
  ### How do I know which subgroup it matched???

  ### I need to know so I can do this
  $lookup=~s/\Q$i_dont_know\E/\Q$s{$matched_regex}\E/;
}
4

1 に答える 1

3

daxim が指摘しているように、ニーズを満たす CPAN モジュールがいくつかあります。Tie::RegexpHashそれらの1つです:

あらすじ

use Tie::RegexpHash;

my %hash;

tie %hash, 'Tie::RegexpHash';

$hash{ qr/^5(\s+|-)?gal(\.|lons?)?/i } = '5-GAL';

$hash{'5 gal'};     # returns "5-GAL"
$hash{'5GAL'};      # returns "5-GAL"
$hash{'5  gallon'}; # also returns "5-GAL"

my $rehash = Tie::RegexpHash->new();

$rehash->add( qr/\d+(\.\d+)?/, "contains a number" );
$rehash->add( qr/s$/,          "ends with an \`s\'" );

$rehash->match( "foo 123" );  # returns "contains a number"
$rehash->match( "examples" ); # returns "ends with an `s'"
于 2012-06-03T12:54:38.290 に答える