我正在编写一个可能会被用户修改的脚本。当前,我将配置设置存储在脚本中。它以哈希散列的形式存在。
我想防止人们在哈希键中意外使用小写字符,因为这会破坏我的脚本。
检查哈希键并仅对任何带有小写字符的键发出警告会很简单,但我宁愿自动修复大小写敏感性。
换句话说,我想将顶级哈希中的所有哈希键都转换为大写。
最佳答案
Andy的答案很不错,除了他uc
的每个键,然后如果不匹配则再次uc
。
此uc
只需执行一次:
%hash = map { uc $_ => $hash{$_} } keys %hash;
但是,由于您提到的是用户存储 key 的方法,因此即使速度较慢,领带也是一种更为可靠的方法。
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
。
关于perl - 如何更改哈希键的大小写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/310115/