2017-02-10 8 views
0

パッケージを理解しようとすると、localmy、およびperlのリファレンス。私はq()の呼び出しの各数を返すことを期待するが、私は、彼らが返すべきかわからないんだけど...Cのファイルスコープ変数と同等のPerlは何ですか?また、サブファイルで使用する方法は?

package z; 
$x = 5; 

sub q() { return $z::x }; 

printf "q() .. %d\n", q(); 

my $xr = \$x; 

my $x = 7; 

printf "xr .. %d\n",$$xr; 

$$xr = 9; 

printf "x .. %d\n", $x; 

$$xr = 11; 

printf "q() .. %d\n", q(); 

を次のスクリプトを考えてみましょう。代わりに、私は次の出力を得る...

q() .. 0 
Argument "" isn't numeric in printf at src/demo/multi_my.pl line 8. 
xr .. 5 
x .. 7 
q() .. 0 
Argument "" isn't numeric in printf at src/demo/multi_my.pl line 22. 
+3

'q()'は ''''を書く別の方法です。別のサブ名を使用してください。 – ikegami

+3

あなたが何のためのものなのかを知り、それを使用する正当な理由がない限り、[prototypes](http://perldoc.perl.org/perlsub.html#Prototypes)は使用しないでください。 'sub foo(){}'は 'sub foo {}'でなければなりません。 – ThisSuitIsBlackNot

+2

'use strict'と' use warnings 'all''をプログラムの先頭に追加して、あなたが書いた他のすべてのプログラムにそれらを追加するので、Perlの動作を現実的に理解する必要があります。 – Borodin

答えて

4

q()''を書くの別の方法です。そのため、q()は空の文字列を返します。あなたのサブとは異なる名前を使用してください。


myは、レキシカルスコープの変数を宣言します。これらは通常、カールによって作成されますが、ファイルはレキシカルスコープでもあります。したがって、ファイルにスコープを設定する変数を使用する場合は、角括弧の外側にmy $x;を使用してください。


あなたがアクセスする最初の$xはグローバルスコープです。プログラム全体で$z::xと表示されます。

関連する問題