2012-03-05 9 views
5

ハッシュ構造のキーとして「コンパイル済み正規表現」(つまり、形式:qr/../の表現)を使用したいと考えています。ハッシュキーの「タイプ」を認識

ハッシュキーを反復処理するときに定数文字列とこれらの正規表現を区別するために、ref()またはis_regexp()を使用しようとしましたが、前者はnull文字列を返し、後者は機能しません。私は、Perlのリファレンスとスカラーに関する根本的なものを見逃しているのではないかと心配しています。

それ以外は、私の解決策はうまくいくようです。それはとにかくあまりにも醜いですか? 代替案は大歓迎です。

ref()機能を理解するためにいくつかのコード:

my $regex = qr/foo/; 
printf "ref(\$regex): %s \n", ref($regex); 
printf "is_regexp(\$regex): %d \n", is_regexp($regex); 
# ref($regex): Regexp 
# is_regexp($regex): 1 

my $scalar = 3; 
printf "ref(\$scalar): [%s] \n", ref($scalar); 
# ref($scalar): [] 

my %my_hash = ('name', 'Becky', 'age', 23); 
for my $k (keys %my_hash) { 
    printf "%s [%s] -> %s [%s] \n", $k, ref($k), $my_hash{$k}, ref($my_hash{$k}); 
} 
# name [] -> Becky [] 
# age [] -> 23 [] 
+5

ハッシュのキーは文字列です。 'ref'はそれらに対して常に' undef'を返します。文字列でないキーとして何かを使用すると、文字列に変換されます。 – Qtax

答えて

7

を改革する必要がなくなります、Perlのハッシュキーは常に文字列です:あなたは、ハッシュキーとして文字列以外のものを使用している場合、それが最初に変換されます文字列に変換する。 McDouglas、マクドナルド、/ MC [-ZA:;私は、たとえば、いくつかのパターン構文をサポートすることができるようにしたい

「私は、configファイルからのカウンタの定義を読む:あなたが書いた別のコメントで

。-z] * /私は、テキストファイルからカウンタ値を読んで、私はそれに応じて、関連するカウンタを更新:マクドナルド23マッキントッシュ11" を

私はこの権利を理解していれば、1つの簡単な解決策は、コンパイル済みの正規表現を格納するためにあるかもしれませんハッシュでは、文字列表記でキーイングされています。

2

Tie::RegexpHashを使用してに何か問題はありますか?それはコメントで、ホイール:) Qtaxノートとして

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" 
+0

あなたが提案するパッケージはかなり興味深いものですが、必要なものとは異なるものを実行します。私の場合は、正規表現を定義する単純な文字列を格納することもできます(ただし、正規表現の事前コンパイルは失われます)。 trwoが衝突する1つのケースは、部分的に重なる正規表現を格納する必要がある場合です。 – AndreaG

+0

@AndreaG:あなたが意味するものの例を挙げてください。 – Zaid

+0

私は設定ファイルからカウンタ定義を読みました。例えば、McDouglas、McDonald、/ Mc [A-Za-z] * /のようなパターン構文をサポートできるようにしたい。その後、テキストファイルからカウンタ値を読み込み、それに応じて関連するカウンタを更新します。 McDonald 23 McIntosh 11 – AndreaG