3
% %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(他のいくつかのコントロールがこの形式であるため試してみました)、2つの違いは何でしょうか。

そのperlアプリはMojoliciousWebフレームワーク上に構築されています。

どうもありがとう!

4

2 に答える 2

8

Raw%pは、グローバル(パッケージ)変数 "%p"を使用すると言います。より技術的には、デフォルトでは、宣言されていない変数名はパッケージ変数と見なされ、現在のパッケージの名前がサイレントに付加されます。たとえば%main::p、メインにいるので、実際には変数を参照します。デフォルトではパッケージ。

しかし、Perlコードがuse strictプラグマを有効にして(mojoの場合のように)インタープリターによって実行される場合、宣言されていない変数への現在のパッケージ名のこの自動プリペンディングは発生しないため、そのような変数を持つコードは変数%pはレキシカルスコープ宣言またはパッケージシンボルテーブルのいずれからも実際には認識されていないため、コンパイルされません。

追加するmyと、 "%p"変数がローカル(字句)スコープに宣言され、strictプラグマを満足させることができます。

Perlでの変数スコープのより詳細な(そしてよりよく書かれた)説明は、Randal SchwartzのStonehendgeコンサルティングWebサイト(http://www.stonehenge.com/merlyn/UnixReview/col46.html )から入手できます。

于 2010-07-03T03:18:48.783 に答える
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上記のコードで複数回使用するとどうなるかに注意してください。変数を不必要に再宣言し、以前に割り当てられたものを上書きします。

ほとんどのプログラミング言語と同様に、変数を1回宣言してから、必要に応じてその変数を繰り返し使用する必要があります。

于 2010-07-03T14:05:30.763 に答える