【问题标题】:Perl Tie::IxHash - update values using a value listPerl Tie::IxHash - 使用值列表更新值
【发布时间】:2013-06-10 14:12:32
【问题描述】:

我有一个 Tie::IxHash 对象,它的初始化如下:

my $ixh = Tie::IxHash->new('a' => undef, 'b' => undef, 'c' => undef);

稍后我想将值列表qw/1 2 3/ 分配给这三个键。我似乎无法在一个声明中找到一种方法来做到这一点。

(我在一个步骤中分配键和在另一个步骤中分配值的原因是,这是 API 的一部分,用户可能希望使用(键,值)接口添加值。)

我尝试了$ixh->Values(0..2) = qw/1 2 3/;,但该方法不喜欢在左侧。

当然,我可以使用 $ixh->Replace(index, value) 编写一个循环,但我想知道是否有我忽略的“批量”方法。

【问题讨论】:

    标签: perl hash indexed tie


    【解决方案1】:
    tie my %ixh, Tie::IxHash::, ('a' => undef, 'b' => undef, 'c' => undef);
    @ixh{qw( a b c )} = (1, 2, 3);
    

    但这并不是真正的大宗商店;这将导致对STORE 的三个调用。


    要访问 Tie::IxHash 特定功能(ReplaceReorder),您可以使用 tied 获取底层对象。

    tied(%ixh)->Reorder(...)
    

    tie 也返回底层对象。

    my $ixh = tie my %ixh, Tie::IxHash::, ...;
    

    【讨论】:

    • 那么,在这种方法中,我会在整个代码中使用 %ixh 而不是 $ixh?这是否意味着我无法使用 OO 界面的“更强大的功能”? (不是我认为这会是一个问题......)
    • 没有你不能通过哈希接口访问的“强大”功能​​。有两个 Tie::IxHash 特有的特性你不能,所以我在我的节点中添加了如何调用这些方法。
    • 不知道tie()。这似乎比保留两个引用同一事物的不同变量(如 %ixh 和 $ixh)更可取。目前我不需要替换/重新排序。
    【解决方案2】:

    Does this mean I couldn't use the "more powerful features" of the OO interface?

    use strict;
    use warnings;
    use Tie::IxHash;
    
    my $ixh = tie my %hash, 'Tie::IxHash', (a => undef, b => undef, c => undef);
    
    @hash{qw(a b c)} = (1, 2, 3);
    
    for ( 0..$ixh->Length-1 ) {
      my ($k, $v) = ($ixh->Keys($_), $ixh->Values($_));
      print "$k => $v\n";
    }
    
    __OUTPUT__
    a => 1
    b => 2
    c => 3
    

    【讨论】:

      猜你喜欢
      • 2013-01-30
      • 2022-01-07
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多