首页 文章

在Perl中使用我的with循环是否很好?

提问于
浏览
5

我在许多标准书籍中看到了许多代码,其中我正在使用如下所示的循环 .

TYPE 1-

foreach my $mykey ( keys %myhash) {
......
}

要么

while(my $line = <$filehandle> ) {
.....
}

在这里,我们为散列的每个键或每行声明变量 . 这是一个好主意吗?

在C / C / Java中,我们先使用声明变量,然后使用它 . 因此,如果我遵循该政策,则上述代码应如下所示 .

TYPE 2-

my $mykey;
foreach $mykey (keys %myhash) {
....
}

要么

my $line;
while($line = <$filehandle> ) {
....
}

它会加速代码执行(我认为)因为根据上下文我们决定可以对变量应用什么类型的操作以及它的行为是什么 .

但我在Perl中看到了TYPE 1代码 . 所以我想我错过了一些perl概念 . 有人请点亮它 .

如果您要说它已经声明/关联到范围一次然后增加,那么请提供一些文档 . 我无法在任何地方得到它 . 我理解变量的范围在两种情况下都是不同的 .

@ http://perldoc.perl.org/perlsub.html#Private-Variables-via-my%28%29--我的运算符声明列出的变量在词法上限制在封闭块,条件(if / unless / elsif / else),循环(for / foreach / while / until / continue),子例程,eval或do / require / use'd文件 .

将使用我的变量关联将在每一步完成?

5 回答

  • 4

    这是一个基准:

    #!/usr/bin/perl 
    use strict;
    use warnings;
    use Benchmark qw(:all);
    
    my @list = ('abc')x1_000_000;
    
    my $count = -2;
    cmpthese($count, {
        'inside' => sub {
            for my $elem(@list) { $elem = '' }
        },
        'outside' => sub {
            my $elem;
            for $elem(@list) { $elem = '' }
        },
    });
    

    Result:

    Rate outside  inside
    outside 14.3/s      --      0%
    inside  14.3/s      0%      --
    

    如您所见,速度方面没有差异 .

  • 4

    首先,最大的区别

    while(my $line = <$filehandle> ) {
    .....
    }
    

    my $line 
    while($line = <$filehandle> ) {
    .....
    }
    

    位于 scope ,远远超过速度或执行时间的优化 .

    在第一种情况下, $line 仅在while循环中可见 . 在那之后,它超出了范围,你恢复了你的记忆,并且你错误的机会更少(通过使用 $line 以后没有得到错误 .

    资料来源:见perldoc about for loops .

  • 9

    他说:

    foreach my $mykey ( keys %myhash) {
      ...
    }
    

    要么

    while(my $line = <$filehandle> ) {
      ...
    }
    

    将变量 $mykey$line 的范围分别限制在 foreachwhile 循环中 .

    您可能还想说use strict 'vars' .

  • 6

    除了其他人对范围所说的内容之外,如果你在 for 循环中不使用词法循环迭代器,你可能会遇到如下代码:

    my $i;
    for $i (1..10) {
        last if check_something($i);
    }
    print $i;
    

    这看起来会在1到10之间打印一些值,具体取决于 check_something 中的逻辑 . 事实上,它将始终打印 undef 因为它被解释为更像:

    my $i;
    {
        local $i;
        for $i (1..10) {
            last if check_something($i);
        }
    }
    print $i;
    

    Perl::Critic RequireLexicalLoopIterators policy中的更多细节 .

  • 3

    我不认为速度可能是两种方法中的问题,因为它将是最小的(如果它不运行一百万次,即使这样也不会太多) .

    类型1,将始终在每次循环运行时清除变量 .

    类型2,它不会在运行时每次都发生 .

相关问题