如何通过散列在Perl

任务。 在代码的Perl程序有一个哈希 %h. 在这一散列有一些对数值。 你需要走过所有的散列项目,并执行行动与各个项目。

走过散列使用 foreach

大多数情况下,最方便的方式来绕过散列是使用 foreach. 这里是一个例子码:

▶ Run
#!/usr/bin/perl

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

foreach my $key (keys %h) {
    print "$key - $h{$key}\n";
}

这是所有的非常简单。 第一,我们创建了一个哈希 %h 有三个对数值。 接下来是一个循环。 使用 keys %h ,我们得到一个列表中的所有的散列键(在这个例子中,行 'a', 'b''asdf'). 关键字串被写入可变 $key ,并执行循环体,然后在 $key 适合以下的散列关键 并再次执行环身体,而这种情况为所有的钥匙。

如果你拯救这个代码文件 script.pl 和运行它 perl script.pl,然后将画面会出现一套对值 包含在哈希:

b - 20
asdf - Hello
a - 1

哈是一个无序设置的价值观。 和结论是清楚可见的顺序就是撤销 元件的散列不匹配所以在他们被限定在程序的代码。 如果你跑 这个脚本了几次,该秩序的要素的产出将会改变。 keys %h 返回该名单的钥匙 散列在任意一个订单。 如果你需要的订单总是相同的,例如,可以使用 排序 foreach my $key (sort keys %h) {.

通过散列使用 whileeach

另一种方式来规避整个散是使用一个循环 while 和关键词 each. 这里是代码 其工作方式类似于以前的例子:

▶ Run
#!/usr/bin/perl

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

while (my ($key, $value) = each %h) {
    print "$key - $value\n";
}

each %h 返回的一个列表中的两个要素—哈希项及其相应的价值。 完全一样 在这种情况下 keys 的顺序 each 返回的对数值是没有定义。 不同的相同的 该计划将返回该对在不同的订单。

我们分配的价值观,这是返回 each 中变量。 each 记得这对哈给了他 下一次使用时返回一个不同的价值对。 这将继续下去,直到 each 不返回你所有的对,然后将返回的一个空洞的名单。 同时 each 返回几值,执行体的 while 周期的,一旦返回的一个空洞的名单 循环 while完成。

改变价值观在哈希

当使用 foreach 循环 keys %h的 执行只有一次。 当使用 while周期 each 正在执行的每一次迭代。

延长以前的问题—我们不仅需要显示所有的元件的散列,但也来替换它们。 它绝对是 没问题时使用 foreachkeys:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

foreach my $key (keys %h) {
    print "$key - $h{$key}\n";
    $h{ $key . $key } = $h{$key};
    delete $h{$key};
}

print Dumper \%h;

输出的程序:

asdf - Hello
a - 1
b - 20
$VAR1 = {
          'bb' => 20,
          'aa' => 1,
          'asdfasdf' => 'Hello'
        };

它不工作时使用 each:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

while (my ($key, $value) = each %h) {
    print "$key - $value\n";

    # error!
    $h{ $key . $key } = $value;
    delete $h{$key};
}

print Dumper \%h;

当你执行这个程序在屏幕上就会出现这样的:

Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
b - 20
bb - 20
bbbb - 20
asdf - Hello
$VAR1 = {
          'asdfasdf' => 'Hello',
          'bbbbbbbb' => 20,
          'a' => 1
        };

each 返回值对从哈,然后我们改变散。 是的以下循环和 each返回 几修改后的散列,它可以返回的对,你只是增加。

因此,如果绕过散列需要改变它,你要使用 foreachkeys. 当使用 whileeach 程序将不会正常工作。

相关的主题

其他文章