我在子例程中有一个变量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执行相同操作时,该变量不会显示为用户在登录期间输入的内容。
答案 0 :(得分: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;
它将帮助您解决许多简单的问题。
答案 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