2

Perlでは、次のコードがあります。

my $val = "0";

for(my $z = 0; $z <= 14; $z++)
{
    ++$val;
    if($val == 9) {
        $val = "A";
    }
    print $val;
}

印刷します:

1 2 3 4 5 6 7 8 A B 1 2 3 4 5

それでも、BからC、CからDなどに続くことになっていますが、この背後にあるロジックは何ですか?

4

2 に答える 2

5

warningsは、次のような警告メッセージを表示します。

引数 "B" は、数値 eq (==) の数値ではありません

use warnings;
use strict;

my $val = "0";

for(my $z = 0; $z <= 14; $z++)
{
    ++$val;
    if($val eq '9') {   #   <------------------
        $val = "A";
    }
    print $val;
}
于 2012-07-16T18:59:36.127 に答える
4

perlopを引用するには:

数値変数、または数値コンテキストで使用されたことのある変数をインクリメントすると、通常のインクリメントが得られます。ただし、変数が設定されてから文字列コンテキストでのみ使用され、値が空の文字列ではなく、パターンに一致する/^[a-zA-Z]*[0-9]*\z/場合、インクリメントは文字列として行われ、その範囲内の各文字がキャリー付きで保持されます。 ... (強調を追加)

$val == 9数値コンテキストです。したがって、Aを出力し(設定しただけです)、マジックインクリメントをBに取得します(数値コンテキストではまだ使用されていません)が、==(数値コンテキストで使用して)にヒットします。 ++$valB は数値 (0) として扱われ、1 に増加します。

を使用eqして文字列を比較し、マジック インクリメントを維持することもできますが、次のように言うこともできます。

print 1 .. 8, 'A' .. 'F';
于 2012-07-16T19:00:27.083 に答える