-1

サブルーチンcurrentUserに変数currentUserがあります。あるサブルーチンには引き継がれますが、別のサブルーチンには引き継がれません。値を保持したまま、変数を複数のサブルーチンに渡すにはどうすればよいですか?

sub login {
    &app_header;
    print <<EOF;
<form name="macform" method="POST" enctype="application/x-www-form-urlencoded"       action="$fullurl">
    ...stuff
    EOF  
}

sub html_menu {
    $me = $currentUser;
    print $me;
    print <<EOF;
    <form name="menuform" method="POST" enctype="application/x-www-form-urlencoded"     action="$fullurl">
    ..stuff
    EOF
    &app_list_button;
    print "<br>";
    &app_search_button;
    print "<br>";
    &app_edit_button;
    print "</div>";
}

html_formサブがhtml_formの後に呼び出される新しいサブでcurrentUserを使用して行うのと同じことを行おうとすると、ユーザーがログイン中に入力したものとして変数が表示されません。

4

3 に答える 3

3
sub first {
    my $currentUser = shift;
    second($currentUser);
}

sub second {
    my $currentUser = shift;
    third($currentUser);
}

...等々。

引数として変数を渡すことは、変数を介して行われ@_ます。グローバル変数を使用しようとしないでください。使用するのに適した方法ではありません。あなたはそのようにそれを行うことができます:

my ($arg1, $arg2, @rest) = @_;

または、、shiftおよびpop上記で使用したような配列を操作する他の方法を使用しshiftます。

まだ行っていない場合は、使用することを強くお勧めします

use strict;
use warnings;

それはあなたが多くの単純な問題を解決するのを助けるでしょう。

于 2012-11-12T17:11:22.463 に答える
2

最も安全な方法は、変数を引数として使用することです。

sub r1 {
    my $arg = shift;
    r2($arg);
}

sub r2 {
    my $arg = shift;
    print "$arg in r2\n";
}
于 2012-11-12T17:08:36.713 に答える
1

html_formサブがhtml_formの後に呼び出される新しいサブでcurrentUserを使用して行うのと同じことを行おうとすると、ユーザーがログイン中に入力したものとして変数が表示されません。

まず、これはかなり複雑な例です。あなたはそれを分解しようとすべきだった。これまでに他の人が言ったことに加えて、意味を変え&ずにサブルーチンの名前の接頭辞を教えます。()あなたはあなたの例でこれを使用します、そしてあなたがそれが何をするかを知っているかどうかはわかりません。これらはすべて、わずかに異なる意味を持っています。

  • foo()fooこれは、引数なしでsubを呼び出すだけです。
  • &fooこれは、暗黙的fooに渡されることを呼び出します。@_重要な注意点として、参照によって変更すると、呼び出し先のも変更さfooれます。@_@_
  • &foo()これはperl4の単なる遺物です。これはfoo、明示的なsubrefsigilを使用して呼び出します。これは、すべてのコンテキストで非推奨になりました。

&質問の範囲外であるプロトタイプと印章との小さな違いもあります

詳細についてはperldoc -q "calling a function"、およびを参照してください。perldoc perlsub

于 2012-11-12T17:55:31.317 に答える