Perl新手。从子例程访问键值对时出现语法错误。
sub displayObj{
my %obj = shift; //the hash. It is a JSON object after decode_json()
my $field = shift; //the key we are searching. It is a string.
my $serialized = "{}"; //Initialization
foreach my $key (keys %obj){
if($key eq $field){
$serialized = $obj[{$field}];
}
}
print "$serialized\n";
}
它在if
块中给出了编译错误。
我想知道:
我应该在%
使用$
还是my %obj
?
如何访问键值对(也是一个JSON对象)并使用$ obj将其分配给$ serialized?
答案 0 :(得分:2)
我认为你正在尝试编写一个子程序,该子程序显示给定键的哈希元素的值
但是你错过了哈希的基本目的:它们是内容可寻址的。这意味着没有必要遍历哈希的所有键,将它们与您正在寻找的字符串进行比较,您可以只编写$hash{key}
并使用哈希快速完成搜索系统(因此是数据类型的名称)。这与使用$array[$i]
直接访问数组元素相同,而不是循环遍历数组的所有索引,将每个索引与$i
进行比较,直到找到您要查找的元素
如果你真的在处理对象,那么你不应该像这样访问它们的内部数据。一个对象将有 accessor 方法,它们返回你应该使用的值;其他任何事情都是班级内部工作的一部分,并且是私人的
语法错误在此行
$serialized = %obj[{$field}]
您似乎正在尝试使用两者哈希键{...}
和数组索引[...]
。这不会起作用
你没有显示你如何调用你的子程序,但是我想你正在将一个引用传递给一个哈希值,这是一个标量值,必须在子程序中对其进行处理。
此程序显示我认为您打算使用的工作版本
use strict;
use warnings 'all';
my $obj = {
aa => 1,
cc => 2,
};
displayObj($obj, 'cc');
displayObj($obj, 'bb');
sub displayObj {
my $obj = shift; # The hash. It is a JSON object after decode_json()
my $field = shift; # The key we are searching. It is a string.
my $serialized = '{}'; # Initialization
foreach my $key ( keys %$obj ) {
if ( $key eq $field ) {
$serialized = $obj->{$field};
}
}
print "$serialized\n";
}
2
{}
但是如我所描述的那样,循环可以完全删除,留下
sub displayObj {
my ($obj, $field) = @_;
my $serialized = $obj->{$field} // '{}';
print "$serialized\n";
}
产生完全相同的结果。事实上,创建一个子程序来做这件事没什么意义;你可以写
print $obj->{bb} // '{}', "\n"
效果相同
答案 1 :(得分:-1)
我通常这样做:
sub displayObj{
my $objref = shift;
my %obj = %{$objref};
}