2012-02-29 7 views
1

私は各フィールド名がキーになるハッシュとして入ってくるHTMLフォームフィールドデータを持っています&フィールド値はハッシュ値...あなたの標準CGIモジュールの出力から:Perlのハッシュキー名のカウンタ変数を使用

my $query = new CGI; 
my %formdata = $query->Vars; 

今回私は、各数字の接尾辞(「NAME2「の」NAME1」...「SIZE1」「size2に」など)を持つ複数のフォームフィールドのコレクションで働いています。これよりも数字順に、それらのグループをループするためのカウンタを使用するより良い方法はありますか?

for (my $i = 1; $i < 10; $i++) { 
    print " Name $i: " . $formdata{"name$i"} . "\n"; 
    print " Size $i: " . $formdata{"size$i"} . "\n"; 
} 

...これは悪いことではありませんが、構文が簡単ですか?私。このような(しかし、これは動作しません - は、パッケージまたはオブジェクト参照なしでメソッド「名前」を呼び出すことはできません):

print " Name $i: $formdata{name$i}\n"; 

答えて

6

明白な解決策は動作しません:

print " Name $i: $formdata{"name$i"}\n"; 

0123:しかし qq演算子( qq{...}または qq(...)または qq/.../または任意-あなたのような)と実際の二重引用符 "..."のセットのいずれかを交換することによって固定することができます。

"Quote and Quote-like Operators" in the perlop man-pageを参照してください。

+0

「name $ i $ formdata {$ varname}」という名前の印刷から別の方法があるかどうかはわかりませんでした。 _entire_キー名が文字列変数に作られたときに二重補間なしで動作するようです... – Wick

+0

@Wick:なぜ "" $ formdata {$ varname} "'が誤解していると思いますか?実際には '$ varname'を補間しません。 '$ varname'を通常の文字列式にするだけです。それは、その式の値をキーとして使用します。ダブルクォートの外側でも '$ formdata {$ varname} 'を書くことができます。逆に '$ formdata {'name'のようなものを書くことができます。 $ i} 'を二重引用符で囲みます。それは理にかなっていますか?だから 'qq {$ formdata {" name $ i "}}'は "二重補間"をしていません。 '$ i'をちょうど1回補間し、補間する。 '$ formdata {'name6'}'は一度だけです。 – ruakh

+0

ああ、ありがとう、それはトン&非常にはっきりと説明します。ほんとうにありがとう! – Wick

2

私は通常、フォーム名プレフィックスに基づいてキーのリストを作成することでこのようなことを行います。たとえば、

my @numbers = sort map { /name(\d+)/ } keys %formdata; 
foreach my $num(@numbers) { 
    print " Name $num: ", $formdata{ 'name' . $num }, "\n"; 
    ... 
} 

これは、任意の数のフォーム要素を処理するという利点があります。

+0

'sort'は、デフォルトではASCIIbetical文字列比較を使用します。単純に 'sort map ... 'ではなく' sort {$ a <=> $ b} map ...'を意味する必要があります。また、 '/ name(\ d +)/'の代わりに '/^name(\ d +)\ z /'を書くことで正規表現を文字列開始と文字列終了に固定する必要があると思います。 – ruakh

+0

ニートは、最大フィールドを取得するための良い固体メソッドのようです。間違いなく、フォームが変更されても誰かがスクリプトを更新するのを忘れてしまった場合に備えて、スクリプトのループを最大限ハードコーディングすることの改善。正確には私が何をしていただけでなく、非常に涼しい!おかげで – Wick

1

"で区切られた文字列に"を使用する場合は、それをエスケープします。

print " Name $i: $formdata{\"name$i\"}\n"; 

区切り記号を変更してください。

print qq{ Name $i: $formdata{"name$i"}\n}; 

または"を使用しないでください。

print " Name $i: $formdata{qq{name$i}}\n"; 
print " Name $i: $formdata{'name'.$i}\n"; 
printf " Name %s: %s\n", $i, $formdata{"name$i"}; 
print " Name $i: " . $formdata{"name$i"} . "\n"; 
+0

素晴らしい、ありがとう。 ruakhはあなたの答えが入ってから1時間ほど前にコメントを聞いていましたが、そうでなければあなたの答えは間違いなく正しいと思います。良いものを持っている – Wick

関連する問題