効率的な変数名の増やし方とは?

このQ&Aのポイント
  • 変数名を任意の数だけ増やす方法について教えてください。
  • 特定のパターンで変数名を繰り返し増やす方法を知りたいです。
  • 変数名の一部を固定し、数値を追加して効率的に増やす方法を教えてください。
回答を見る
  • ベストアンサー

変数名を任意の数だけ増やしたい。

変数名を任意の数だけ増やしたい。 @convert_keys= qw(name1 name2 name3 name4 name5 name6 name7 name8 name9 name10); for my $key (@convert_keys) { if($FORM{$key}){} } 上記のやりかたで変数を増やしているのですが、 例えば、変数を1000個にしたい場合は、name1~name1000までを一個一個書くとなると大変です。 @convert_keysに効率よくname1~name1000までを入れる書き方はないでしょうか? 名前(name)の部分は固定で、数値が追加されます。 よろしくお願いいたします。

  • Perl
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

余談だけど, 最初に配列をいきなり作らないとだめなの?

yuutoOK
質問者

お礼

$key= "name$_"; 訂正です。

yuutoOK
質問者

補足

ありがとうございます。あまりperlの知識がないので、これ以外の方法を思いつかなかったのですが、配列を作っておく必要はありません。教えていただいたmapについて調べていた最中、思いついた以下の方法で試してみたところ、期待通りの動作になったような感じなのですが、使い方を間違っていますでしょうか。やはりこういう場合はmapを使うやり方を調べたほうがいいでしょうか? for (1..1000) { $key= "item".$_; if($FORM{$key}){} }

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

map

関連するQ&A

  • オブジェクト名に変数を使いたい

    <form id="form1" name="form1" method="post" action=""> <label for="q1-1"><input id="q1-1" name="q1" type="radio" value="1" />あ</label> <label for="q1-2"><input id="q1-2" name="q1" type="radio" value="0" />い</label> <label for="q1-3"><input id="q1-3" name="q1" type="radio" value="0" />う</label> <label for="q1-4"><input id="q1-4" name="q1" type="radio" value="0" />え</label> <label for="q2-1"><input id="q2-1" name="q2" type="radio" value="1" />あ</label> <label for="q2-2"><input id="q2-2" name="q2" type="radio" value="0" />い</label> <label for="q2-3"><input id="q2-3" name="q2" type="radio" value="0" />う</label> <label for="q2-4"><input id="q2-4" name="q2" type="radio" value="0" />え</label> </form> ============================================================ 上のような4択の問題が10問あります。 これを採点して合計点数を表示させたいと思っていますが、 下記のようにfor文を使う際、オブジェクト名の、"q1"の"1"というところに変数nを使いたいのですが、やり方がわかりません。 ============================================================ for(var n=0;n<10;n++){ var length=document.form1.q1.length; for(var i=0;i<length;i++){ var checked=document.form1.q1[i].checked; if(checked==true){ ans = i; } } var value=document.form1.q1[ans].value; } ============================================================ いろいろ調べてみましたが、うまくいかず固まっております。 どなたかご教授いただけませんでしょうか?

  • 静的ハッシュの配列のキーに対応する値の数の多さ順で表示させたい

    ハッシュのキーに対応する値の数の多さ順で表示させたいと考え、下記の所まで試行錯誤しておりますが、どうにも思ったようにソートできずにおります。 #!/usr/bin/perl use strict; my(%a, $i, $j ,$allarray ,@keys ,@keys2 ,%hash ,%files ,$a_mumei_ref ,$key ,$value ,@value ,$x ,$files); # ハッシュの配列を静的に作る %a = ( '0' => [ qw(0) ], '1' => [ qw(1 1) ], '3' => [ qw(3 3 3) ], '7' => [ qw(7 7 7) ], '2' => [ qw(2) ], '4' => [ qw() ], '5' => [ qw() ], '6' => [ qw() ], '8' => [ qw(8 8) ], '9' => [ qw(9) ], ); @keys = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %a; #ハッシュのキーを数字順で表示 foreach (@keys){ print $_ ."\n"; } # 静的に作ったハッシュの配列を取り出してみる foreach $i (sort keys %a) { for ($j = 0; $j <= scalar(@{$a{$i}})-1; $j++) { print '$a{'. $i. '}['. $j. ']='. $a{$i}[$j]. ' '; } $allarray=scalar(@{$a{$i}})-1; print "No$i:kosuu:$allarray"; print "\n"; #配列の値の個数を調べその配列を作成 my($a_mumei) = $allarray; $a_mumei_ref = \$a_mumei; $files{"$i"}=($i,$a_mumei_ref); } #each関数で%filesの中身を表示 while ( ( $key , $value ) = each %files ){ print "key:$key value:$$value\n" ; } #試行錯誤 foreach $x (sort { $files{$b} <=> $files{$a} } keys %files){ print "$x => $files->{$x}\n"; } @keys2 = sort {$hash{$a} <=> $hash{$b}} keys %files; #@keys2 = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %files; #@keys2 = sort { $hash{$a} cmp $hash{$b} } keys %files; print "@keys2\n"; print "\n"; __END__; 私のイメージしておりますのは、ソートした結果がハッシュのキーに対応する値の数の多さ順で下記のように表示させたいのですが、 どのようにすれば可能でございますか、ご教授願えませんでしょうか key:3 value:2・・・この場合valueは配列の個数 key:7 value:2 key:8 value:1 key:1 value:1 key:9 value:0 key:2 value:0 key:0 value:0 key:6 value:-1 key:4 value:-1 key:5 value:-1

    • ベストアンサー
    • Perl
  • 変数名をプログラムで変える

    変数名$keyにある数字を一文字ずつ$w1、$w2・・・に入れていきたいと考えています。 if (isset($key)){ for($i=1;$i<strlen($key);$i++){ $w[$i]=substr($key,$i-1,1); } 変数w1、w2をfor文の中で変化させていきたいのですが、どのようにすればいいのでしょうか。 上記の$w[$i]ではだめでした。(配列になっちゃうのかな) 例えば$key=5432の場合、 $w1=5; $w2=4; $w3=3; $w4=2; としたいのです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • POSTの値を配列として受け取ってソースを効率的にしたい。

    //ポストの値を配列を使って受け取る方法。 $post_key = array_keys($_POST); $post_val = array_values($_POST); for ($i = 0; $i < count($post_key); $i++) { $$post_key[$i] = mb_convert_encoding($post_val[$i], "EUC-JP", $enc_input); } 今こんな感じで書いていて、前はこんな感じで書いていました。 if( isset( $_POST['com_name'])){//会社名 $com_name = mb_convert_encoding($_POST['com_name'], "EUC-JP", "$enc_input"); } こういうのがずっと続きます。 流石に効率が悪いので配列を使って受け取りたいのですが、 なかなかうまくいきません。 教えていただけたら嬉しいです。 $enc_inputという変数を準備しておいてダミーで送らせた内容をいくつかの文字コードで受け取りそれをEUC-JPに置き換えてるだけです。 出力のときにエンコードしてるのでソースの中でごちゃごちゃしてるとかはないと思います。

    • ベストアンサー
    • PHP
  • 変数名を変数で指定するのに$_POST[

    http://oshiete1.goo.ne.jp/qa2691790.html の#1さんに,変数名を変数で指定できることを教わりました. 下記の3行目のように,です. for ($i=1;$i<=5;++$i){ if (${"var".$i}=="") { ${"errMsg".$i}=$i."が未入力"; } } ここで, (1) $_POST["form"] には「str」という文字列が入っています. (2) $Var には「10」という数値が入っています. (3) これらを結合し, どうしても $_POST["str10"] みたいな変数を作らなければならないのですが, ・<? echo $_POST["str" . $Var]; ?>では何も起こらず. ・<? echo $_POST[{"str" . $Var}]; ?>などと{}で括っても, Parse error: parse error, unexpected '{', expecting ']' in C:\temp.php on line 10. みたいなエラーになります. どういうのが正しい書き方でしょうか?

    • 締切済み
    • PHP
  • デコードフォームについて。

    以下のスクリプトについて質問があります。かなり多いのですが・・・ sub DecodeForm #返り値:Name=>Val のハッシュ(グロブ) #使用例:*form = EncodeForm(); print $form{name}; { my($encoding) = @_; my($method) = $ENV{'REQUEST_METHOD'}; local($query, @in, $key, $val); require 'jcode.pl' if $encoding; if ($method eq 'GET') { $query = $ENV{'QUERY_STRING'}; } elsif ($method eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } local(@query) = split(/&/, $query); foreach (@query) { tr/+/ /; ($key, $val) = split(/=/); # %HH形式を元の文字にデコードする。 $key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; $val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; $val =~ s/\r\n/\n/g; jcode'convert(*key, $encoding) if ($encoding); jcode'convert(*val, $encoding) if ($encoding); $in{$key} = $val; } return *in; } 多いので先頭から順に箇条書きにさせて頂きます。 ・Name=>Val の意味。(#以下がメモであることは分かっています) ・グロブとは何か ・*form = EncodeForm(); print $form{name}; の意味。(特に、先頭の*が分かりません) ・my $encoding という変数も見たことがあるのですが、my($encoding) と my $encoding はどう違うのか。 ・クエリとは何か ・jcode.pl とは、インストールしたPerlに標準でついているライブラリなのか?そうでないのならjcode.plとは何か? ・%HH形式とは何か ・\rの意味 ・jcode'convert の意味 ・*key の * の意味 ・*in の * の意味 多くて申し訳ないです。分かる方いらっしゃいましたご教授くださると幸いです。よろしくお願いします。

    • ベストアンサー
    • Perl
  • 変数の保持

    変数の保持 1.PHP $pst=$_POST; if(is_array($pst)){ foreach($pst as $key => $value) {$$key=$value;global $$key;} } if($action==""){ require_once 'index.html'; } elseif($action=="login2"){ require_once 'top.html'; } elseif($action=="top2"){ require_once 'top2.html'; } **.html <form method="post" action="1.php"> <input type="hidden" name="action" value="login2"> <input type="text" size="10" name="uusid"> <input type="submit" value="submit"> </form> htmlはすべてのページでform記述です。 例として、5ページある場合に、現在のところ、$uusidを5ページ目まで保持できないのですが、どうしたらいいのでしょうか? もしかして、グローバル関数化は可変変数ではできなかったんでしょうか? ・1p目:$uusid入力 ・2p目:print($uusid);で確認 ・3p目:<?=$uusid?>を使用するも消えてる

    • ベストアンサー
    • PHP
  • Perl 変数 連番 for

    いつもお世話になっております。 for文?の使い方を教えてほしいです。 my $test1 = $form->param('test1'); my $test2 = $form->param('test2'); my $test3 = $form->param('test3'); my $test4 = $form->param('test4'); my $test5 = $form->param('test5'); このようにtestは同じでその後ろに連番がついている場合の変数なのですが これが何十個もあれば、記述するのも管理するのも、少し面倒です。 それでfor文を利用し、 for ($i= 1; $i < 31; $i++){ この中の記述 } ソースを短縮したいのですが、 「この中の記述」がわかりません・・・ ご教示お願い致します。

    • ベストアンサー
    • Perl
  • 変数の表示の仕方(改行の扱い)

    perl初心者です。よろしくお願いします。 ひとつの変数で、print関数での表示とテキストエリアでの表示を しようとしているのですが、改行の扱いに困っています。 テキストエリアで<br>を表示させないようにすると、print関数の 方の改行がなくなるし、print関数の方に改行させると、テキスト エリアで<br>が表示されるし・・・。 print関数で改行、テキストエリアでは<br>が出ずに改行という 風にしたいのですが、どなたかご教授していただけませんか? よろしくお願いします。 #!/usr/local/bin/perl use strict; #データファイル my $datafile='./data.dat'; #ライブラリの読み込み require './jcode.pl'; my $input; #フォームデータの読み込み if ($ENV{REQUEST_METHOD} eq "POST"){ read (STDIN,$input,$ENV{CONTENT_LENGTH}); }else{ $input=$ENV{QUERY_STRING}; } #フォームデータのデコード my %form = (); my @pairs = split(/&/, $input); foreach my $pair ( @pairs ){ my( $name, $value ) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; #SJISコード変換 &jcode::convert(\$value, 'sjis'); $value =~ s/\r\n/<br>/g; $value =~ s/\r/<br>/g; $value =~ s/\n/<br>/g; $form{$name} = $value; } #データのオープン open(DAT,"+<$datafile"); flock(DAT, 2); #ファイル読み込み my $line = <DAT>; for ( split /\t/ , $line ) { my( $key , $value ) = $_ =~ /^([^=]*)=(.*)$/; #フォームデータの上書き $form{$key} ||= $value; } #データの書き込みとクローズ seek(DAT,0,0); $line = ''; while (my($key,$value) = each %form) { $line .= "${key}=${value}\t"; } print DAT $line; close(DAT); &header; print $form{A}; print "<br>"; print $form{B}; print "<br>"; print $form{C}; print "<br>"; print <<EOM; <b>[内容確認]</b> <form action="new.cgi" method="POST"> <INPUT TYPE="text" SIZE="27" name="A" value="$form{A}"><br> <INPUT TYPE="text" SIZE="90" name="B" value="$form{B}"><br> <TEXTAREA name="C" ROWS="2" COLS="27">$form{C}</TEXTAREA><br> <input type="submit" value="上記内容で送信"> </form> <br> </body> </html> EOM exit; #----------------------------------------------------------------------------------- # HTMLヘッダー #----------------------------------------------------------------------------------- 割愛

    • ベストアンサー
    • Perl
  • htmlからcgiに変数を配列にして渡すとき

    フォームにて、質問1,2,3…と入力してもらい、 1を答えないで2を答えるとか、 2を答えないで3を答えるとかを排除したいので、 変数を配列にして受け取りたいのです。 とりあえず今のところはこうなってます。↓ #htmlファイル# <INPUT type="text" size="30" name="situmon[1]"> <INPUT type="text" size="30" name="situmon[2]"> ... としてcgiに持っていき、 #cgiファイル# for($i=1; $i<=4; $i++){ if($form{'situmon[$i]'} eq "" && $form{'situmon[$i+1]'} ne ""){ &error; #→エラーメッセージサブルーチン exit; } } のようにして受け取ろうとしてるのですが、うまくいきません。 上のようにhtmlではどう書くべきか、cgiではどう受け取るべきかを教えてくだされば嬉しいです。

    • ベストアンサー
    • CGI

専門家に質問してみよう