我有一组预定义的哈希表,我想使用变量名称引用其中一个哈希值并访问键值。即使填充了哈希,以下代码也会返回null。我在这里做错了什么,或者有更好的方法来实现这个目标吗?
my %TEXT1 = (1 => 'Hello World',);
my %TEXT2 = (1 => 'Hello Mars',);
my %TEXT3 = (1 => 'Hello Venus',);
my $hash_name = 'TEXT1';
my $hash_ref = \%$hash_name;
print ${$hash_ref}{1}; #prints nothing
答案 0 :(得分:5)
你所使用的代码很好 *
<!doctype html>
<html>
<head>
<title>Socket.IO App</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font: 13px Helvetica, Arial;
}
form {
background: #000;
padding: 3px;
position: fixed;
bottom: 0;
width: 100%;
}
form input {
border: 0;
padding: 10px;
width: 90%;
margin-right: .5%;
}
form button {
width: 9%;
background: rgb(130, 224, 255);
border: none;
padding: 10px;
}
#messages {
list-style-type: none;
margin: 0; padding: 0;
}
#messages li {
padding: 5px 10px;
}
#messages li:nth-child(odd) {
background: #eee;
}
</style>
</head>
<body>
<ul id="messages"></ul>
<form action="">
<input id="m" autocomplete="off" /><button>Send</button>
</form>
<script src="/socket.io/socket.io.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>
<script>
$(function () {
var socket = io();
$('form').submit(function(){
socket.emit('chat message', $('#m').val());
$('#m').val('');
return false;
});
});
</script>
</body>
</html>
你做错的主要是http://www.example.com/game,这就是%TEXT = (1 => abc, 42 => def);
$name = 'TEXT';
print ref($name); # ""
no strict 'refs';
print ${$name}{1}; # "abc"
print $name->{42} # "def"
$ref = \%$name;
print ref($ref); # "HASH"
print $ref->{1}; # "abc"
print ${$ref}{42}; # "def"
下不允许这种事情的原因。
* - 除非您在use strict 'refs'
下运行,否则您应该
答案 1 :(得分:3)
使用哈希来包含哈希值。
my %texts = (
TEXT1 => { 1 => 'Hello world', },
TEXT2 => { 1 => 'Hello Mars', },
TEXT3 => { 1 => 'Hello Venus', },
)
my $hash_name = 'TEXT1';
print $texts{$hash_name}{1}, "\n";
答案 2 :(得分:0)
以下代码是对标量的赋值,而不是散列:
my $hash_name = 'TEXT';
以下代码分配给哈希:
my %hash = ( alpha => 'beta', gamma => 'delta' );
要从哈希中打印单个元素的值,请说:
print $hash{alpha}, "\n";
您可以引用该哈希并将其分配给变量:
my $hashref = \%hash;
从中可以打印出来自hashref的单个元素:
print $hashref->{alpha}, "\n";