% %p = ('option1' => 'Option 1',
% 'option2' => 'Option 2',
% 'option3' => 'Option 3'
% );
<select name="killer_feature" id="killer_feature" class="select">
% foreach (keys %p) {
% my $selected = param('killer_feature') && param('killer_feature') eq $_ ? 'selected="selected"' : '';
% if (!param('killer_feature') && $_ eq 'option2') { $selected = 'selected="selected"' }
<option value=" <%=$_%>" <%= $selected %>>
<%= $p{$_} %>
</option>
% }
</select>
上面的代码通过返回“内部服务器错误”来破坏应用程序,但是如果我将第一行编辑为% my %p
(我试过它,因为其他一些控件都有这种格式)它可以工作,我想知道什么是两者之间的区别。
它是一个基于Mojolicious Web框架构建的perl应用程序。
非常感谢!
答案 0 :(得分:8)
原始%p
表示使用全局(包)变量“%p”。为了更加技术化,默认情况下,非声明的变量名称被认为是一个包变量,并且使用当前包的名称进行静默预先填写 - 例如它实际上是指%main::p
变量,因为默认情况下你在主包中。
但是如果Perl代码由启用了use strict
pragma的解释器运行(就像使用mojo一样),那么这个自动预先挂起的当前包名称为un-声明的变量不会发生,因此具有这样的变量的代码将不会编译,因为变量%p
实际上不是从词法范围声明或包符号表中知道的。
添加my
将“%p”变量声明为本地(词法)范围,现在它将很高兴地满足strict
编译指示。
对于Perl中变量作用域的更深入(更好的书面)解释,可以从Randal Schwartz的Stonehendge咨询网站获得:http://www.stonehenge.com/merlyn/UnixReview/col46.html
答案 1 :(得分:2)
您的真实问题似乎是: my
关键字是什么?为什么需要它?
my
用于在本地范围内声明变量,也在本地声明子例程:
#!/usr/bin/perl
use strict;
my $foo = "defined in outer";
print_result ("outer",$foo); # outer: defined in outer
{
# $foo has not yet been defined locally
print_result ("inner",$foo); # inner: defined in outer
my $foo = "defined in inner"; # defining $foo locally
print_result ("inner",$foo); # inner: defined in inner
my $foo; # re-declaring $foo
print_result ("inner", $foo); # inner:
}
# even though $foo was defined in the subroutine, it did not
# override the $foo outside the subroutine (localization occured)
print_result ("outer",$foo); # main: defined in main
sub print_result {
my ($proc,$value) = @_;
print qq{$proc:\t$value\n};
}
由于Mojolicious使用use strict
,因此需要使用my
,our
,local
等声明所有变量。
请注意在上面的代码中多次使用my
时会发生什么。它不必要地重新声明变量,覆盖先前分配的内容。
与大多数编程语言一样,您只需要声明一次变量,然后根据需要再次使用该变量。