允许将裸字分配给单个变量,同时仍然在perl中使用strict吗?

dso*_*len -3 perl

我想继续使用strict,但是有一个特定的位置,我想为变量分配一个裸字,以便稍后用作哈希键.我正在寻找一种方法,允许我干净利落,同时仍允许我使用严格.

我的代码的简化版本将是这样的:

sub assignElement{
   my $self = shift;
   my($element_name, $value) = @_;

   #sanity check values

   $self->{$element_name} = $value;
}

sub assignName{
 my $self = shift;
 my($value) = @_;

 $self->assignElement(name, $value);
}

sub assignAddress{
 my $self = shift;
 my($value) = @_;

 $self->assignElement(addr, $value);
}
Run Code Online (Sandbox Code Playgroud)

真正的代码更复杂,但实际上我正在做类似上面的事情,使用通用的assignElement方法,该方法适用于各种元素值以允许代码重用.

元素键是预定义的,目前都是裸字.我知道我可以把它们变成字符串,但我更喜欢它们保持简单.它们经常被引用,引用它们的时间很繁琐; 此外,我在其他所有哈希键中使用裸字,因此在这种情况下不使用裸字会感觉不一致.

有没有一种方法可以让perl忽略对单个方法调用(或单个变量赋值)的裸字的严格检查,同时允许使用strict strict来照常运行?

ike*_*ami 5

稍作改动:

$self->assignElement(name => $value);
$self->assignElement(addr => $value);
Run Code Online (Sandbox Code Playgroud)

缺点:

  • 相应的getter将是丑陋的($self->getElement(name =>))或不一致的($self->getElement('name')).

没有改变:(创建常量/子命名addrname)

use constant {
   map {; $_ => $_ } qw(
      addr name
   )
};

$self->assignElement(name, $value);
$self->assignElement(addr, $value);
Run Code Online (Sandbox Code Playgroud)

缺点:

  • 您必须在所有想要使用它们的模块中定义/导入常量.
  • 可能存在冲突.