从子例程访问和显示Perl中的键值对

时间:2016-03-23 21:00:19

标签: perl

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?

2 个答案:

答案 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}; 

}