8

ユーザーによって変更される可能性が高いスクリプトを作成しています。現在、スクリプト内に構成設定を保存しています。ハッシュオブハッシュの形で存在します。

ハッシュ キーに誤って小文字を使用しないように注意したいと思います。スクリプトが壊れてしまうからです。

ハッシュ キーを検査し、小文字を含むキーに対して警告を発行するのは簡単ですが、大文字と小文字の区別を自動的に修正したいと思います。

つまり、トップレベル ハッシュのすべてのハッシュ キーを大文字に変換したいと考えています。

4

3 に答える 3

15

Andy の答えは良い答えです。ただし、彼はucすべてのキーであり、uc一致しない場合はもう一度答えます。

これucは一度だけです:

%hash = map { uc $_ => $hash{$_} } keys %hash;

しかし、鍵を保存しているユーザーについて話したので、引き分けは遅くても確実な方法です。

package UCaseHash;
require Tie::Hash;

our @ISA = qw<Tie::StdHash>;

sub FETCH { 
    my ( $self, $key ) = @_;
    return $self->{ uc $key };
}

sub STORE { 
    my ( $self, $key, $value ) = @_;
    $self->{ uc $key } = $value;
}

1;

そして主に:

tie my %hash, 'UCaseHash'; 

それはショーです。「tie魔法」はそれをカプセル化するので、ユーザーは無意識のうちにそれを台無しにすることはできません.

もちろん、「クラス」を使用している限り、構成ファイル名を渡してそこから初期化できます。

package UCaseHash;
use Tie::Hash;
use Carp qw<croak>;

...

sub TIEHASH { 
    my ( $class_name, $config_file_path ) = @_;
    my $self = $class_name->SUPER::TIEHASH;
    open my $fh, '<', $config_file_path 
        or croak "Could not open config file $config_file_path!"
        ;
    my %phash = _process_config_lines( <$fh> );
    close $fh;
    $self->STORE( $_, $phash{$_} ) foreach keys %phash;
    return $self;
}

次のように呼び出す必要があります。

tie my %hash, 'UCaseHash', CONFIG_FILE_PATH;

...いくつかの定数を仮定しますCONFIG_FILE_PATH

于 2008-11-21T21:49:51.113 に答える
13

ハッシュを調べて、小文字のキーを対応する大文字に置き換え、古いキーを削除します。だいたい:

for my $key ( grep { uc($_) ne $_ } keys %hash ) {
    my $newkey = uc $key;
    $hash{$newkey} = delete $hash{$key};
}
于 2008-11-21T20:43:54.600 に答える