質問

これは、配列内で値が発生する回数をカウントする簡単なPerlです。これは警告なしで実行されます。

use warnings;
use strict;

my @data = qw(1 1 2 3 4 5 5 5 9);
my %histogram;
foreach (@data)
{
    $histogram{

これは、配列内で値が発生する回数をカウントする簡単なPerlです。これは警告なしで実行されます。

$histogram{

これは、配列内で値が発生する回数をカウントする簡単なPerlです。これは警告なしで実行されます。

use warnings;
use strict;

my @data = qw(1 1 2 3 4 5 5 5 9);
my %histogram;
foreach (@data)
{
    $histogram{

これは、配列内で値が発生する回数をカウントする簡単なPerlです。これは警告なしで実行されます。

<*>

ループ本体が次のように変更されたとき

<*>

Perlは、「初期化されていない値を追加で使用する」と警告します。

内部で何が起こっているのですか? ++演算子のオペランドとして指定され、+演算子で初期化されていない場合、値が初期化されるのはなぜですか?

}++; }

ループ本体が次のように変更されたとき

<*>

Perlは、「初期化されていない値を追加で使用する」と警告します。

内部で何が起こっているのですか? ++演算子のオペランドとして指定され、+演算子で初期化されていない場合、値が初期化されるのはなぜですか?

} = $histogram{

これは、配列内で値が発生する回数をカウントする簡単なPerlです。これは警告なしで実行されます。

use warnings;
use strict;

my @data = qw(1 1 2 3 4 5 5 5 9);
my %histogram;
foreach (@data)
{
    $histogram{

これは、配列内で値が発生する回数をカウントする簡単なPerlです。これは警告なしで実行されます。

<*>

ループ本体が次のように変更されたとき

<*>

Perlは、「初期化されていない値を追加で使用する」と警告します。

内部で何が起こっているのですか? ++演算子のオペランドとして指定され、+演算子で初期化されていない場合、値が初期化されるのはなぜですか?

}++; }

ループ本体が次のように変更されたとき

<*>

Perlは、「初期化されていない値を追加で使用する」と警告します。

内部で何が起こっているのですか? ++演算子のオペランドとして指定され、+演算子で初期化されていない場合、値が初期化されるのはなぜですか?

} + 1;

ループ本体が次のように変更されたとき

<*>

Perlは、「初期化されていない値を追加で使用する」と警告します。

内部で何が起こっているのですか? ++演算子のオペランドとして指定され、+演算子で初期化されていない場合、値が初期化されるのはなぜですか?

}++; }

ループ本体が次のように変更されたとき

<*>

Perlは、「初期化されていない値を追加で使用する」と警告します。

内部で何が起こっているのですか? ++演算子のオペランドとして指定され、+演算子で初期化されていない場合、値が初期化されるのはなぜですか?

役に立ちましたか?

解決

+演算子は、左側のフォームと右側のフォームの両方を評価し、両方の合計を返します。ハッシュ呼び出しの評価では、特別なコンテキストは表示されません。

++演算子には、特別な魔法が組み込まれています。++演算子に関するperlopマンページからの引用:

  

&quot; undef&quot;は常に数値として扱われ、特にインクリメントする前に0に変更されます(したがって、undef値のポストインクリメントは&quot; undef&quot;ではなく0を返します)。

edit :違いを詳しく説明するために、++はその場で値を変更しますが、+は引数を入力として受け取ります。 +が未定義の値を見つけた場合、通常は何かがおかしくなりますが、++の場合、ハッシュ操作の例は非常に一般的です-ユーザーは毎回チェックして初期化する代わりに、undefを0として扱いたいと考えています。したがって、これらの演算子をこのように扱うことは理にかなっているようです。

他のヒント

Perlが必ずしも値を初期化するわけではありませんが、常にそれらについて警告するわけではありません。常に例外を見つけるので、このルールを考えようとしないでください。そして、あなたがそれを見つけたと思うとき、Perlの次のバージョンはあなたの警告を変更します。

この場合、Harleqinが言ったように、自動インクリメント演算子には特別なケースがあります。

特定の演算子は、「未初期化」を意図的に省略します。あなたの便宜のための警告 0または&quot;&quot;が使用される状況で一般的に使用されるためです。左または唯一のオペランドのデフォルト値は理にかなっています。

これらは、++および-(preまたはpost)、+ =、-=、。=、| =、^ =、&amp;&amp; =、|| =。

です。

これらの一部がタイ変数で使用された場合、誤って警告を出すことに注意してください。 /t/op/assignwarn.t "rel =" nofollow noreferrer "> http://perl5.git.perl.org/perl.git/blob/HEAD:/t/op/assignwarn.t 。

ブライアンが言ったように、それはまだそれを行います、ただあなたに警告します。警告は、意図しない効果を伴う特定の操作について通知します。

特に、 $ histogram {$ _} の値を求め、1を追加してから同じスロットに割り当てています。ここで自動生存が機能するとは思わないのと同じ方法です:

my $hash_ref = $hash_for{$key_level_1};
$hash_ref->{$key_level_2} = $value;

ここでのように:

$hash_for{$key_level_1}{$key_level_2} = $value;

マジックはおそらく最適化のようには機能しません。最適化コンパイラは、 a = a + 1 a ++ と同じであることに気付くため、アセンブリ言語にインクリメント演算子があった場合、代わりにその最適化された命令を使用できます最初の値を保持する必要があるふりをして、実際には必要ないので上書きします。

最適化は、実行ごとにパフォーマンスを改善するための追加の精査とオーバーヘッドです。ただし、動的言語では、オーバーヘッドを削減しようとするのと同じ速度でオーバーヘッドを追加しないという保証はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top