質問

私見として良いか聞かれているところでこのスクリプトに努めていのデバッグおよび文献の間で広く受け入れられています。き予測すくれますか?

役に立ちましたか?

解決

ミスコーピング.ですっきりコンセプト。多くの人で使用しない、またはそのことがわかるまい。

基本的には考え my るために、次の方針に基づき環境やアンカー変数のプロ{},A.K.A.ます。

my $foo if (true); # $foo lives and dies within the if statement.

なので、 my 変数は何を使っています。は動的なスコーピング$varでき宣言はどこでも使用します。この local す基本的には利用の停止するグローバル変数使用した"地域の価値"をご用意してお待ちしています。なので local を一時範囲のための臨時に変更します。

$var = 4;
print $var, "\n";
&hello;
print $var, "\n";

# subroutines
sub hello {
     local $var = 10;
     print $var, "\n";
     &gogo; # calling subroutine gogo
     print $var, "\n";
}
sub gogo {
     $var ++;
}

このプリント:

4
10
11
4

他のヒント

その答えはる my マーク変数として、もしくはプライベートでは、語彙の範囲、 local マーク変数として民間のダイナミックです。

の例がわかりやすいのですが my, 出来るローカル変数には、通常です。あ新しい変数を作成したものだけがアクセス可能な内を囲んで語彙のブロック、マ巻きブレース.あり、一部の例外を除けば、巻きブレスは、原則など

foreach my $x (@foo) { print "$x\n"; }

っPerlいことをやるという意味するとか。通常使うようになります:

sub Foo {
   my $x = shift;

   print "$x\n";
}

その場合、 $x は民間の型とその範囲を囲まれた巻きブレース.もの注この対 local, でも、その範囲の my 変数が定義されるコードをそのままに書かれたファイルです。でコンパイル時の現象になります。

理解 local, が必要で考えるので、呼び出しスタックのプログラムです。時の変数は local, では、再定義からの視点 local 決算実行のために下からすべてのスタックまで、帰りのスタックの呼び出し側のブロックを含む local.

この混乱、では、次の例を検討してください。

sub foo { print "$x\n"; }
sub bar { local $x; $x = 2; foo(); }

$x = 1;
foo(); # prints '1'
bar(); # prints '2' because $x was localed in bar
foo(); # prints '1' again because local from foo is no longer in effect

foo と呼ばれる、トヨタグループをはじめ、世界のグローバル価値の $x を1とします。時 bar 呼び local $x ランredefinesのグローバル $x のスタックです。現時 foo ですから呼び出され bar, では、新しい価値の2 $x.これまでにないもので、同じこということを目的として活動していないのに local.マジックが bar 返し口の動作範囲 local $x 前回のグローバル $x が目に入りました。そうした最終コール foo, $x は1となっています。

まほとんどを利用したい my, ていること局所変数のだ。一青い月 local は本当に便利な涼います。

を引用 学習Perl:

が現地でのmisnamed、少なくともmisleadingly。友人のチップSalzenbergいる場合にはたくチャンスに戻し時間機械1986年、ラリーのアドバイス、言い伝えLarry呼び地方の名で"保存"です。[14]ことになるので現地で実際に保存されたグローバル変数の値を離れ、その後自動的に復元される、グローバル変数となります。(右:これらのいわゆる"地方"の変数は実際にグローバル変数!) この保存と修復機構はいつも感しています回の制御変数のforeachで商品情報を順次取得、@_配列の型パラメータ。

なので、 local 省グローバル変数の現在の値を設定して何らかの形の空値となる。まくでslurp全体のファイルよりも先で、ライン:

my $file_content;
{
    local $/;
    open IN, "foo.txt";
    $file_content = <IN>;
} 

呼び出し local $/ セット入力レコードセパレータの値Perlを停止し読みで"線"で)に空の値が宇宙船オペレーターの全体のファイルのようなヒット入力レコードセパレーターが不要になる。

私ももっと成長しなけのないクマークジェイソンDominus'を網羅的に論文を中心に:

http://perldoc.perl.org/perlsub.html#Private-Variables-via-my()

とは異なりダイナミックな変数の作成 地元のオペレータ、語彙の変数 宣言って完全に隠れた 外界からの含意 というサブルーチン.この場合はtrue この同型から呼び出され 自身や他--呼び出しのたびに取得し 独自にコピーします。

http://perldoc.perl.org/perlsub.html#Temporary-Values-via-local()

地元の変更にその変数に上場 する"地方"は、囲むブロック <エバール>は、ファイルを、いず 型内から呼び出されること ブロックです。現地でを一時 価値をグローバルを意味するパッケージ) 変数.れを生じさせるものではありませんで現地 可変となります。このとして知られる動的 スコーピング.語彙のスコーピングを行うこととなり 私は、作品のようにCの自動車 宣言も行いました。

とは思わないことがあるか、というより"地元を囲むブロック"、ではその元の値は復元され、ブロックで終了した.

もGoogleっす。 http://www.perlmonks.org/?node_id=94007

からのリンク:

次のプロジェクト:"私の"新規作成 変数の地区)に一時的に補償 の価値は可変となります。

すなわち、地区)に 一時的に変化さ 価値の変動, がみ 範囲 もし存在します。

一般的に使い、より迅速ないような変わっている。

から man perlsub:

とは異なりダイナミックな変数が作成した地元のオペレータ、語彙の変数を宣言って完全に隠れから外の世界を含むというサブルーチン.

なので、oversimplifying, my この変数だけが見える場所で宣言しています。 local して可視の呼び出しスタックです。ます通常使いたい my の代わりに local.

お混乱が理解できなければならない。語彙のスコーピングはかなり理解しやすそしてダイナミックスコーピングは珍しいコンセプト。の状況がさらに悪化するの mylocal 少し不正確または少なくともunintuitive)のための歴史的な理由があります。

my を宣言すると語彙の変動--一から見えるポイント宣言の終わりまで囲むブロック(またはファイル).ですから完全に独立しその他の変数と同じ名前のプログラム。では、リニューアルグランドオープンするブロックです。

local, 一方,を宣言すると一時変化の価値はグローバル変数となります。変更の端末を囲み、その変動--グローバルでは見えるものです。

経験則として、利用 my を宣言するのに、独自の変数と local 制御変動の影響を受けるPerlの変数.

をより徹底解説参照マークジェイソンDominus'第 対応スコーピング.

地元では古い方法の局在の時にはPerlた動的スコーピング.スコーピングの語彙のではなく自然のためのプログラマーに、より安全に多くのです。私の所属変数のスコープ(ブロック、パッケージ、またはファイル)にて宣言しています。

ローカル変数ではなく実際に所属するグローバル名前空間.を参照すれば、変数$x、かつドメイン::意見であり、事実の表明ではあり、グローバル変数となります。に反してその名が示すとおり、すべての地域な押し新たな価値をスタック値のドメイン::x末までにこのブロックの古い値がおすすめ。るのに便利な機能ではないローカル変数の事由について考えることができたのスレッド!について考えることがご利用いただきますと、日常のことを真というグローバルでの局!).しかし、こうして変数のようにローカル変数の悪い旧日前Perl5.いたします。

"私の"変数の現在のコードブロックのみです。"地域の"変数をもって見えます。例えば、"ということを私$x;"と呼び、サブ機能できる変数$x.だ"ということを地方$/;"(nullの値のセパレータ)その方法の変更からの読み出しファイルを作る機能です。

実際にはほとんどいのは"私"、"地域".

実際には下記のようにコードおよびその出力の理解には差額をいただきます。

our $name = "Abhishek";

sub sub1
{
    print "\nName = $name\n";
    local $name = "Abhijeet";

    &sub2;
    &sub3;
}

sub sub2
{
    print "\nName = $name\n";
}

sub sub3
{
    my $name = "Abhinav";
    print "\nName = $name\n";
}


&sub1;

出力:

Name = Abhishek

Name = Abhijeet

Name = Abhinav

dinomiteの例を再定義する記録の区切り文字は時間をいた多くのperlプログラミング私はニッチなperl環境"セキュリティグにもなっているのでほとんど使われていません範囲が楽しめます。

&s;

sub s()
{
    local $s="5";
    &b;
    print $s;
}

sub b()
{
    $s++;
}

上記スクリプトの版画6.

その地域の私では5を出力します。

これには差額をいただきます。シンプルです。

と思うための最も簡単な方法は覚えています。私の新しく作成します。地域を一時的に変更の値は既存の変数となります。

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