使用一个键,它是perl中哈希值中常量的值

时间:2017-03-28 15:24:00

标签: perl hash

请检查以下代码:

my %hash = (
123 => "a",
456 => "b",
); 
use constant x_1 => 123;
use constant x_2 => 456;

我想使用类似$ hash {x_1}的内容 得到“一个”。我试图将x_1存储到变量中,然后将其用作键,它可以工作。 喜欢

my $var = "x_1"; # or my $var = x_1

但是当我从存储到变量中的数组中获取变量x_1,然后尝试从该变量访问散列时,它会显示错误。 喜欢

my @arr;
$arr[0]{"y_1"} = "x_1";
$arr[0]{"z_1"} = "x_2";
my $newVar = $arr[0]{"y_1"};#$newVar = x_1
print $hash{$newVar}; #this shows error.

我怎样才能将变量用作字符串而不是常量?

2 个答案:

答案 0 :(得分:1)

  

我想使用$ hash {x_1}这样的内容来获取“a”

通过使用除标识符之外的任何内容,表达式不会自动引用。例如,您可以使用以下任何一种方法:

  • $hash{+CONSTANT}
  • $hash{(CONSTANT)}

因此,您可以使用$hash{+x_1}代替$hash{x_1}

  

我怎样才能将变量用作字符串而不是常量?

你理所当然地要求通过添加use strict;来阻止这样做,因为它是dangerous(意思是难以阅读,难以调试,难以维护等等)。

解决方案1:使用查找表。

my %lookup = (
   x_1 => x_1,
   x_2 => x_2,
);

my @arr;
$arr[0]{"y_1"} = "x_1";
$arr[0]{"z_1"} = "x_2";

my $newVar = $arr[0]{"y_1"};
defined( my $key = $lookup{$newVar} )
   or die("Invalid key");

print $hash{$key};

解决方案2:使用常量值代替其名称。

my @arr;
$arr[0]{"y_1"} = x_1;
$arr[0]{"z_1"} = x_2;

my $newVar = $arr[0]{"y_1"};
print $hash{$newVar};

答案 1 :(得分:0)

常量只是一个Perl子例程,可以取消引用保存子例程名称或子例程引用的变量来调用子例程。

use constant x_1 => 123;
my %hash = (123 => 'a', 456 => 'b');
my @arr = ( { y_1 => 'x_1', z_1 => 'x_2' } );

#   $arr[0]{y_1}  holds 'x_1'
#   $arr[0]{y_1}->()   calls  'x_1'->(),  or  &x_1()
#   can also say  &{$arr[0]{y_1}}
my $key = $arr[0]{y_1}->();
print $hash{$key};            # 'a'

这些结构在use strict下不受欢迎(你做use strict,不是吗?),这意味着你可能想重新考虑你的设计。