'%p'和'my%p'之间的区别?

时间:2010-07-03 03:15:16

标签: perl mojo mojolicious

% %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应用程序。

非常感谢!

2 个答案:

答案 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,因此需要使用myourlocal等声明所有变量。

请注意在上面的代码中多次使用my时会发生什么。它不必要地重新声明变量,覆盖先前分配的内容。

与大多数编程语言一样,您只需要声明一次变量,然后根据需要再次使用该变量。