2016-08-04 4 views
3

per5では、 "my"を使わずに$ fooや@barなどの変数を使うことができます。私はいつも "私"を使う必要がないので、perl6は自動気化しないのですか?

$foo=1; @bar=(1,2); 

なぜ私はいつも「私」を使用しなければならないのですか?それ以外の場合、コンパイラは変数宣言されていないと言います。なぜperl6は自動起動しませんか?

print "{my @a=1,2,3;}\n"; # have to use "my" to declare variable 
print "{@a=1,2,3;}\n"; # this is error 'Variable '@a' is not declared' 

"my"を常に使用する必要はありません。これはCのように低すぎます。非常に面倒です。

常に自動更新を有効にする方法はありますか?

ありがとうございました。

+2

これは、それが以前のバージョンではうまくいったからです。 Perl 5のコードを 'use strict'と' use warnings'(またはあなたの代わりにそれを行う他の宣言)で起動しないと、恐ろしいPerl 5コードを書いています。私は、 "Modern Perl"(著者/出版社が無料でオンラインで提供している)という本を読むことをお勧めします。 –

+2

これはCのような低レベルではなく、むしろ非常に高いレベルです。アセンブリのような非常に低レベルのプログラミングでは、最初に使用するものを宣言することなく、任意のRAMアドレスを使用することができます。忘れてしまうと、2つの変数に同じRAMアドレスを誤って使用してバグが発生する可能性があります。 'my'は、あなたが言葉にヒントを与えることを可能にします:ねえ、これは私が変数を宣言するところです。コンパイラを宣言する前にそれを使用すると文句を言うことがあります。それからあなたは間違いをしたことを知っています。 – slebetman

+1

* "これは、それが以前のバージョンではうまくいったからです。"デフォルトでは、すべてのPerl 5変数はパッケージ変数です。 Perl 5の方法が間違っていたので、これがデフォルトです。 – Borodin

答えて

10

明示的な変数宣言を持たないことは、さまざまな理由で言語設計の観点からひどい考えです。間違いなく、明示的に宣言されたブロックスコープのレキシカル変数がありますが、私はそれが「間違っている」というスクリプト言語の多くの言語が狂っていることを発見しました(letがJavascriptに追加された理由は...)

つまり、Perl6は宣言を省略することができるno strictプラグマをサポートしています。

4
no strict; 
$foo=1; @bar=(1,2); 
print "{@a=1,2,3;}\n"; 
# OUTPUT«1 2 3␤» 

Perl 6は、適切なエラーメッセージを表示しようとします。すべての変数を宣言すると、タイプミスがあった場合にどのような変数が使用されたかを推測できます。また、宣言子なしで書き込むことができない定数やシグネチャ変数などの新しい言語機能もあります。

+1

素晴らしい!あなたの考えを共有していただきありがとうございます。私は「厳格でない」自由が好きだと思う。 – lisprogtor

+3

@lisprogtor:残念ながら、「自由」には、言語が報告しないバグを書く自由が含まれています。非常に最近の例として、OPが見つからなかったPerlスクリプトを作成し、すべてのシーケンスを逆転させる*(http://stackoverflow.com/questions/38775912/)を見てください。それらが '$ NUM_COL'と' $ NUM_C0L'の両方を使って引き起こしたバグです。 'my'キーワードは頻繁に使用されるので最短のものであり、' no strict'を数行以上使用するプログラムはひどく書かれたプログラムです。 – Borodin

関連する問題