2017-08-24 10 views
-1

私はperlでわずか1ヶ月の経験です。 perlベースのプログラム実行問題では、commend変数が以前の値に戻されました。 問題は何ですか? ここにコードがあります。この状態で変数がPerlの以前の値に戻されました

1st(); 
2nd(); 
sub 1st { 
     $cmd = "cat asdf"; 
} 
sub 2nd { 
    if ($code =~ /aa/) { 
      my $cmd = "$reg $annotation"; 
      out_log($cmd); 
    } else { 
      my $cmd = "$reg $annotation"; 
      out_log($cmd); 
    } 
    out_log("$cmd"); 
    open (Work,$cmd); 
} 

$ cmdををif文で登録しますが、if文の後に$ cmdを実行していた、$ cmdを値は、サブルーチンの第一の値を返されました。 アドバイスをいただきありがとうございます。

+2

実際には、サブは数字で始めることはできません。 – simbabque

答えて

4

語彙パッケージの変数が混在しています。あなたのプログラムがuse strictuse warningsの場合、これはかなり明らかです。

myで変数を宣言しないと、Perlは変数をパッケージ変数とみなします。プログラムのすべての部分から(同じ名前空間内に)表示されます。

myで変数を宣言すると、という語彙になります。それはそれだけで範囲内に存在することを意味しそれで作成しました。

my $foo = 1;   # 
        # 
if ($foo) {  # # 
    my $bar = 2; # # 
}     # # 
       ^^ 
        | | scope that $foo exists in 
        | scope that $bar exists in 

同じことがここで起こっています。

あなたは1stサブ内"cat asdf"に(::main名前空間である)パッケージ変数$::cmdを設定しています。次に2ndというサブフォルダを呼び出し、elseブランチに入ります。その範囲では、新しい字句$cmdが作成されます。それはプログラムのその部分でのみ有効です。その後、out_log()に渡され、おそらくそれが印刷されます。その後、"cat asdf"の値をout_log()に設定して$::cmdを渡します。その時点で新しい$cmdはもう存在しません。あなたのプログラムでuse strictを持っていた場合、デフォルトのパッケージ変数の挙動が、その場合にはオフになっているので、あなたは、変数を定義する必要がありますので

code with freehand lines

、プログラムは、まったく動作しません。

実際には、パッケージ変数で操作するのではなく、引数を関数に渡すべきです。

それに加えて、あなたのプログラムではうまくいかないことがいくつかあります。 3つの引数openと字句ファイルハンドルを使用し、戻り値がopenであることを確認する必要があります。

機能名は数字で始めることができないので、1st2ndは有効な名前ではありません。彼らがやっていることや表現したことの後で物事に名前を付ける方がいいです。これにより、後でプログラムを読みやすくなります。

完全なプログラムはそのように見えます。

use strict; 
use warnings; 

my ($code, $reg, $annotation); # these values come from somewhere... 

run_cmd(compose_cmd(), $code, $reg, $annotation); 

sub compose_cmd { 
    return "cat asdf"; 
} 

sub run_cmd { 
    my ($cmd, $code, $reg, $annotation) = @_; 

    if ($code =~ /aa/) { 
     my $cmd = "$reg $annotation"; 
     out_log($cmd); 
    } 
    else { 
     my $cmd = "$reg $annotation"; 
     out_log($cmd); 
    } 
    out_log("$cmd"); 
    open my $fh, '<', $cmd or die $!; 

    # do stuff with $fh ... 
} 

sub out_log { 
    print @_; 
} 
+0

ああ、申し訳ありません。最後のout_logは、$ cmdの値をチェックするためのものでした。このフォームは、私の質問のための長いスクリプトのスクリプトです。どうもありがとうございました!! –

関連する問題