6

多くの標準的な本で、以下のようなループで my が使用されている多くのコードを見てきました。

タイプ1-

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

また

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

ここでは、ハッシュのキーごと、または行ごとに変数を宣言しています。

C/C++/Java では、最初に変数を宣言してから使用していました。したがって、そのポリシーに従えば、上記のコードは次のようになります。

タイプ 2-

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

また

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

コンテキストに従って、変数に適用できる操作の種類とその動作を決定するため、コードの実行が高速化されます(私は思います)。

しかし、私は TYPE 1 コードの大部分が Perl であるのを見てきました。だから私はいくつかのperlの概念が欠けていると思います. 誰か光を当ててください。

スコープに一度宣言/関連付けられ、その後のみインクリメントされると言う場合は、いくつかのドキュメントを提供してください。私はどこにもそれを得ることができませんでした。どちらの場合も変数のスコープが異なることを理解しています。

@ http://perldoc.perl.org/perlsub.html#Private-Variables-via-my%28%29-- my 演算子は、条件付き (if/unless/ elsif/else)、ループ (for/foreach/while/until/continue)、サブルーチン、eval、または do/require/use'd ファイル。

my will を使用した変数の関連付けは、各ステップで行われますか?

4

5 に答える 5

7

ベンチマークは次のとおりです。

#!/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 = '' }
    },
});

結果:

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

ご覧のとおり、速度に関しては違いはありません。

于 2013-09-23T09:06:19.383 に答える
5

スコープについて他の人が言ったことに加えて、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 ポリシーを参照してください。

于 2013-09-23T08:48:09.567 に答える
3

速度は最小限になるため、両方のアプローチで速度が問題になるとは思いません(100万回実行されない場合でも、それほど多くはありません)。

タイプ 1 は、ループが実行されるたびに常に変数をクリアします。

タイプ 2、実行時に毎回発生するわけではありません。

于 2013-09-23T06:26:53.803 に答える