8

まず第一に、私は C、Java、Python のバックグラウンドを持っています。'0'最近、新しい仕事のために Perl の学習を始めたのですが、 (0-string) が false であることに興味を持ちました。

この特定の動作が、Perl がファイルを読み取るための演算子を持たなければならなかった理由であると<>読んだことがあります。しかし、Perl が成熟した言語であることも知っており、この動作には用途があると推測しています。そうでなければ、ずっと前に修正されていたはずです。

では、どのような場合に'0'= false が役立つのでしょうか?

4

6 に答える 6

11

と関係があると読んだ<>場合は、悪いソースを読んでいます。その主張がどこから来るのか想像できません。

ほとんどどこでも perl は数値形式と文字列形式で格納された数値を区別しないため、'0' は false です。ブール テストでこれを行うと、このグレインに対して実行されます。

'0' が true である言語 (Python、Javascript?) では、'' が false であることは奇妙だと思います。ある文字列を例外にして、他の文字列を例外にしないのはなぜですか?

于 2013-01-09T01:48:41.240 に答える
10

Perl には明示的な型付けがなく、型の解釈はコンテキストに大きく依存します。例えば:

$a = "2b";
$b = "3a";
$c = $a + $b;
print $c;

5 が得られます。

一方で...

$a = "b2";
$b = "3a";
$c = $a + $b;
print $c;

3が得られます。

と...

$a = "b2";
$b = "3a";
$c = $a.$b;
print $c;

b23aが得られます

したがって、「'0' (文字列)」は、使用するまでは文字列でも数値でもブール値でもありません。操作してみるまでタイプは判別できません。次に、Perl はコンテキストを評価してユーザーの意図を確認し、それに応じて行動します。これは機能であり、なぜ Perl にはさまざまな方法があります。もちろん、多くの混乱を招くコードにつながる可能性がありますが、1 ライナー、難読化、および Perl ゴルフには優れています。

于 2013-01-09T01:49:16.090 に答える
7

Perlは、C、 awk、Bourne シェル、およびその他の多くの言語を含む、他の多くの言語から機能を継承します。

C では、値 0 は false であり、ゼロ以外の値は true です。Perl は同じセマンティクスを使用しているだけです。

Perl には C よりもスカラーまたはブール コンテキストで使用できるもの (特に文字列) が多いという事実は、Perl に複数のfalse 値があることを意味します。

整数0を false にすることは、C プログラマにとって完全に理にかなっています。空の文字列""を false にすることも理にかなっています。Perl は同じスカラーを数値または文字列として扱うことができるため、文字列を"0"false にすることはほぼ避けられませんでした。

例えば:

$x = 2;
$x -= 2;
print "x = $x\n"; # prints "x = 0"
if ($x) {
    print "A C programmer would be surprised to see this\n";
}

$x = "";
$x .= chr(48);
# Now $x eq "0", a string value that was built without reference to
# the number zero -- but it's nearly the same thing as the number 0.
print "\$x = $x\n"; # pritn "x = 0"
if ($x) {
    print "A C programmer would be equally surprised to see this\n";
}

Perl が他の言語からそれほど多くの機能を借用することなくゼロから設計されていた場合、文字列と数値をスカラーとしてグループ化するのではなく、より強力に区別していた可能性があります。このような架空の Perl に似た言語を考えると、空の文字列と数値0は false になる可能性が非常に高くなりますが、文字列は true になり、数値から文字列"0"に変換するには明示的な変換が必要になります。0"0"

でもPerlはそのまま。

于 2013-01-09T01:48:05.360 に答える
7

内部ストレージ形式は、理想的には、Perl では問題になりません。IV、UV、NV、PVなどに保存されているかどうかに関係なく、ゼロはゼロです。

実際、Perl は値を格納するフォーマットを驚くような方法で変更します。string0が true の場合、次は「true」を出力します。

$x = 0;
print("$x\n");
if ($x) {
   print("true\n");
} else {
   print("false\n");
}
于 2013-01-09T01:56:53.120 に答える
2

Perlには、「false」と見なされる値がいくつかあります。undefゼロ、文字列"0"、空の文字列、コンテキストに応じて空の文字列または空のリストに変形する特別なブール値、およびブールコンテキスト用にオーバーロードされたオブジェクトです。

これらのほとんど(undef、ゼロ、空の文字列、特殊値、オブジェクト)は、実際には非常に便利です。文字列"0"がfalseであるのは、perlがスカラーとfalsenessを実装する方法に由来します。スカラーには文字列部分と数値部分の両方が含まれます。値がfalseの場合は、最初に文字列部分を調べて判断します。なぜこれが必要なのですか?

my $false_ish = 0;  # the scalar contains only a number
'' . $false_ish;    # force stringy context. the scalar now contains stringy portion.
if ($false_ish) { ... } # string portion is consulted first...

これがないと、文字列が必要な場所で使用すると、数値ゼロはその誤りを失います。一方、これにより"0 but true"、ゼロである真の文字列、およびゼロの"0E0"科学的記数法であるが、真と評価される真の文字列が可能になります。

于 2013-01-09T01:51:51.707 に答える
0

0はCでもfalseに相当します。これは、いくつかの「レガシー」プログラミング言語ではfalseに相当します。これは、おそらく0がバイナリおよび回路に固有に関連付けられているためです。0は「無料」を意味します。

いずれにせよ、新しい言語は以前の言語の振る舞いと解釈を継承することがよくあります。0が「無料」または「料金があるのは誤り」という2進数の意味は、高水準プログラミング言語から抽象化されてから長い年月が経ちましたが、最新のプログラミング言語でもセマンティックのちょっとした情報が残っています。

また、私の知る限り、それは<>とは何の関係もありません-どこでそれを読みましたか?

于 2013-01-09T16:06:03.487 に答える