5

サブルーチン変数の値を別のサブルーチン変数に転送するにはどうすればよいですか。グローバル変数を使用できますか。

sub foo(){

my $myvar = "Hello";
} 

sub foo1(){
my $myvar1 = $myvar;   # how can I get the "Hello" from $myvar.
}

パッケージとグローバル変数を使おうとしましたが失敗しました。

Package Bar;
our $bar;

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

4

5 に答える 5

15

2 つの関数を含むスコープで変数を宣言できます。

{ my $myvar

  sub foo{
    $myvar = "Hello";
  } 

  sub foo1{
    my $myvar1 = $myvar;   
  }
}

ただし、これは実際にはエレガントではなくfoo1、 の値がどこ$myvarに設定されているかが明確でないため、維持するのが難しい場合があります。変数を引数として渡す方がよいでしょう。

sub foo {
    my $myvar = "Hello";
    return $myvar;
}

sub foo1 {
  my( $myvar)= @_;
  my $myvar1 = $myvar;
}

# calling code
my $myvar= foo();
foo1( $myvar);

$myvar3 つすべてが、異なるスコープ内の異なる変数であることに注意してください。

余談ですが、プロトタイプ ( sub foo()) を使用することは、彼らが何をしているのかを本当に理解していない限り、おそらく良い考えではありません (プロトタイプに関する議論については、プロトタイプに関する問題を参照してください)。

于 2010-06-04T08:10:54.383 に答える
6

サブルーチン変数の値を別のサブルーチン変数に転送するにはどうすればよいですか? グローバル変数を使用できますか?

はい、次のことができます。

my $myvar;
sub foo(){
    $myvar = "Hello";
} 

sub foo1(){
    my $myvar1 = $myvar;   # how can I get the "Hello" from $myvar.
}

これは、「use strict;」でも機能します。および「警告を使用する」。

パッケージとグローバル変数を使用しようとしましたが、失敗しました。

パッケージ変数は、パッケージ外にエクスポートする変数用であり、同じパッケージ内の 2 つのサブルーチン間で共有したい変数用ではありません。

于 2010-06-04T08:21:04.990 に答える
3

使用しないでくださいmy

#!/usr/bin/perl

sub foo() {
  $myvar = "Hello\n";
}

sub foo1() {
  $myvar1 = $myvar;
    print $myvar1;
}

print "here we go!\n";
foo();
foo1();

ただし、このプログラミング方法はお勧めしません。

于 2010-06-04T07:59:00.683 に答える
2

いくつかのアプローチがあります。

最も簡単なのは、変数をで宣言しないことですmy。ただし、これを回避する必要がありuse strict;、結果として推奨されません。

スクリプトの上部にある関数ので変数を宣言できます。この変数は、以下のすべての関数で使用できます。これはスコープの結果です。変数は、中括弧のセットの外側で宣言し、通常、後続の中括弧の内側で使用できます。

use vars qw/$myvar/;プラグマを使用して変数を宣言できます。これにより、本質的に、次のコード全体で変数を使用できるようになります。

于 2010-06-04T07:53:18.617 に答える
2

次のコードは、説明した内容に対する解決策を示している可能性があります。

#!/usr/bin/perl
use strict;
my $var = "hello";
sub foo {
    local *var;
    print "$var world\n";
    $var = "hi";
}

sub bar {
    local *var;
    print "$var world\n";
    $var = "hey";
}

foo();
bar();
print "$var world\n";

結果は次のようになります。

hello world
hi world
hey world
于 2011-07-08T13:39:55.390 に答える