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

3zz*_*zzy 3 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>
Run Code Online (Sandbox Code Playgroud)

上面的代码通过返回'内部服务器错误'来破坏应用程序,但是如果我轻松编辑第一行% my %p(我试过它,因为其他一些控件都有这种格式)它可以工作,我想知道两者之间的区别.

它是一个基于Mojolicious Web框架的perl应用程序.

非常感谢!

DVK*_*DVK 8

Raw %p说要使用全局(包)变量"%p".为了更多的技术,默认情况下,一个没有定义的变量名被认为是一个包变量,并默默地与当前包的名称前置于-例如,这将是非常参照%main::p变量,因为您的主要是包默认.

如果Perl代码通过与解释器运行use strict启用编译指示(因为它与魔力),该自动预未决于未声明的变量的电流包名称的情况不会发生,因此,这样的变量将在代码不能编译,因为%p从词法范围声明或包符号表中实际上不知道该变量.

添加my声明了"%P"变量到本地(词法)范围和它现在将愉快地满足strict编译.

在Perl变量范围的深度(和更好的书面)更多的解释是从兰德尔·施瓦茨的Stonehendge咨询网站可用的编缉:http://www.stonehenge.com/merlyn/UnixReview/col46.html