【问题标题】:How can I iterate through this Perl structure?如何遍历这个 Perl 结构?
【发布时间】:2012-08-25 17:27:41
【问题描述】:

鉴于以下代码,我试图弄清楚如何遍历哈希引用数组(或者至少我认为它是一个哈希引用数组)。也就是$Policy->rules()?

也许有更好的方法来创建结构数组,我愿意接受建议。

use Class::Struct;
use Data::Dumper;

struct Policy => {         
    listings    => '@',  # Will treat like rules eventually.     
    rules       => '@',  # an array of rules      
};

struct Rule => {                
    direction   => '$',        
    id          => '$',        
};

$policy = Policy->new();

$rule1 = Rule->new();
$rule1->direction('Any');
$rule1->id(1);

$rule2 = Rule->new();
$rule2->direction('Inbound');
$rule2->id(2);

$rule3 = Rule->new();
$rule3->direction('Outbound');
$rule3->id(3);

push($policy->rules(),$rule1);
push($policy->rules(),$rule2);
push($policy->rules(),$rule3);

$Data::Dumper::Indent = $Data::Dumper::Terse = 1;
print Dumper \$policy;

输出:

\bless( {
    'Policy::listings' => [],
    'Policy::rules' => [
      bless( {
        'Rule::id' => 1,
        'Rule::direction' => 'Any'
      }, 'Rule' ),
      bless( {
        'Rule::id' => 2,
        'Rule::direction' => 'Inbound'
      }, 'Rule' ),
      bless( {
        'Rule::id' => 3,
        'Rule::direction' => 'Outbound'
      }, 'Rule' )
    ]
  }, 'Policy' )

【问题讨论】:

    标签: arrays perl printing hash reference


    【解决方案1】:
    visit_policy($policy);
    
    sub visit_policy {
       my ($policy) = @_;
    
       my $listings = $policy->listings;
       my $rules    = $policy->rules;
    
       for my $listing (@$listings) {
          visit_listing($listing);
       }
    
       for my $rule (@$rules) {
          visit_rule($rule);
       }
    }
    
    sub visit_listing {
       my ($listing) = @_;
       # ...
    }
    
    sub visit_rule {
       my ($rule) = @_;
    
       my $direction = $rule->direction;
       my $id        = $rule->id;
    
       # ...
    }
    

    【讨论】:

    • 您好,感谢您的帮助。我不得不稍微调整一下。 Visit_listing() 被称为 2x。在更改 visit_rule 以获取 $rule->direction 和 $rule->id 后,当它尝试在第 66 行对 $rule->direction 进行定义时出现以下错误:Can't call method "direction" on unblessed reference。
    • 应用了你提到的修复。测试了它。不要得到你得到的错误,你提供的信息也没有意义。
    • 我如何获得被引用的祝福?
    • 这是我正在运行的:visit_policy($policy);子访问策略 { 我的 ($policy) = @_;我的 $listings = $policy->listings;我的 $rules = $policy->rules;对于我的 $listing (@$listings) { visit_listing($listing); } 对于我的 $rule (@$rules) { visit_rule($rules); } } 子访问列表 { 我的 ($listing) = @_; # ... } 子访问规则 { 我的 ($rule) = @_;我的 $direction = $rule->direction;我的 $id = $rule->id;打印 $id 。 "\n"; # ... }
    • 我明白了。你是对的。我确实把它顶起来了。我重新开始,现在它工作得很好。非常感谢。
    【解决方案2】:

    感谢您的帮助。它看起来很接近,但仍然需要几个星期。见下文。现在,当我运行它并尝试打印规则-> id 时,我得到以下信息:

    无法在 D:/SLC/Aiken/Policy/POC/OLAP/test.pl 第 66 行的 unblessed 引用上调用方法“direction”。

    visit_policy($policy);
    
    sub visit_policy {
       my ($policy) = @_;
    
       my $listings = $policy->listings;
       my $rules    = $policy->rules;
    
       for my $listing (@$listings) {
          visit_listing($listing);
       }
    
       for my $rule (@$rules) {
          visit_rule($rules);
       }
    }
    
    sub visit_listing {
       my ($listing) = @_;
       # ...
    }
    
    sub visit_rule {
       my ($rule) = @_;
    
       my $direction = $rule->direction;  #<-- Line 66 
       my $id        = $rule->id;
    
        print $id . "\n";
    
       # ...
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-12
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2021-07-18
      • 2015-02-02
      • 1970-01-01
      相关资源
      最近更新 更多