变量instanciation VS双哈希引用访问

OMG*_*uts 0 perl

最初,我一直在寻找一种快速访问哈希引用元素的方法(如果没有可用的值,则使用默认值).

所以我尝试了以下方法:

use strict;
use warnings;
use DateTime;
my $hashref = { };
for (0..249) {
  my $lIdx = $_ * 2;
  $hashref->{"MYKEY$lIdx"} = "MYVAL$lIdx";
}

sub WithVariable{
    my $result = $hashref->{"MYKEY$_[0]"};
    return defined $result ? $result : "NONE";
}

sub WithoutVariable{
    return defined $hashref->{"MYKEY$_[0]"} ? $hashref->{"MYKEY$_[0]"} : "NONE";
}
$|++;
my @preciousvalues1 = ();
my @preciousvalues2 = ();
my $dt = DateTime->now;
for (1..25000) { for (0..498) { push @preciousvalues1, WithVariable($_) } }
my $lag = DateTime->now - $dt;
print "With a variable: ", $lag->seconds, "\n";
$dt = DateTime->now;
for (1..25000) { for (0..498) { push @preciousvalues2, WithoutVariable($_) } }
$lag = DateTime->now - $dt;
print "Without a variable: ", $lag->seconds, "\n";

print "Done\n";
Run Code Online (Sandbox Code Playgroud)

但结果似乎是随机的,perl似乎在打印"完成"之后做了很多事情,并且需要永远退出.

我的问题是:

  1. 如果没有找到值,那么允许以默认值访问存储在哈希值中的值的函数的整洁实现是什么?
  2. 打印"完成"之后perl在做什么呢?垃圾收集 ?

Perl版本:这是为MSWin32-x86-multi-thread构建的perl,v5.10.1

mob*_*mob 5

  1. 从版本5.10开始,您可以使用//(defined-or)运算符测试已定义的值,并在一个步骤中指定默认值.
$result = $hashref->{$key} // "NONE"

如果定义了该值,则设置$result$hashref->{$key},"NONE"否则.

2.或多或少.如果它困扰你,打一个

    use POSIX;
    POSIX::_exit(0);

在脚本的最后.这将立即结束您的脚本,绕过Perl的正常关闭例程(以及您放入END { }块中的任何代码).在这个脚本上使用它可能不是什么大问题,但通常不是最佳使用方法_exit.