如何通过perl中的多个子例程传递变量?

时间:2012-11-12 17:05:08

标签: perl variables subroutine

我在子例程中有一个变量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执行相同操作时,该变量不会显示为用户在登录期间输入的内容。

3 个答案:

答案 0 :(得分:3)

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

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

......等等。

通过@_变量传递变量作为参数。您不应该尝试使用全局变量,这不是一个好方法。你可以这样做:

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

或者使用shiftpop和其他操纵数组的方法,就像我上面使用shift一样。

如果您还没有这样做,我强烈推荐您使用

use strict;
use warnings;

它将帮助您解决许多简单的问题。

答案 1 :(得分:2)

最安全的方法是使用变量作为参数:

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

sub r2 {
    my $arg = shift;
    print "$arg in r2\n";
}

答案 2 :(得分:1)

  

当我尝试做同样的事情时,html_form子在html_form之后调用的一个新子域中对currentUser做了同样的事情,该变量不会显示为用户在登录时输入的内容。

首先,这是一个相当复杂的例子。你应该试图打破它。为了补充其他人到目前为止所说的内容,我将告诉你子例程名称上的&前缀而不添加()更改含义。你在你的例子中使用它,我不确定你是否知道它的作用。所有这些都有不同的含义。

  • foo()这只是简单地调用没有参数的子foo
  • &foo这会调用foo隐含地传入@_。重要提示,如果foo通过引用修改@_,则@_也会因被调用方而发生变化。
  • &foo()这只是perl4的遗物。这会使用显式的subref sigil调用foo。这在所有情况下都已弃用。

原型和问题范围之外的&符号也存在细微差别

有关详细信息,请参阅perldoc -q "calling a function"perldoc perlsub