Perlの連想配列とWhileループについて

このQ&Aのポイント
  • Perlの連想配列を使用して果物の値を格納し、キーボードからの入力でその値を取り出す方法について説明します。
  • 入力された値が格納された果物以外の場合は、ループを使って3種類から選ぶように促す方法についても解説します。
  • さらに、入力時には<STDIN>を使用し、chomp関数を使って末尾の改行文字を除去する方法についても説明します。
回答を見る
  • ベストアンサー

perlのwhile,連想配列についてです。

perlの連想配列を使い "AP" => "Apple" "BN" => "Banana" "OG" => "Orange" という値を格納します。 そしてこの格納した値をキーボードからの入力で取り出します。 このように表示したいです↓↓ "好きな果物を入力してください[AP/BN/OG]" そして入力を受けるとその果物の値を返し果物の名前を表示します↓↓ "あなたの好きな果物はAppleですね" ここまではできたのですが、この格納した果物以外を入力するとwhileで格納した果物が入力されるまで"3種類から選んでください”というようにループしたいです。 この場合どのように書けばよいのでしょうか。 whileの場合andで書きたい場合はどのように書けばよいのでしょうか。 また入力には<STDIN>を使い引数はchmopで処理すると良いとアドバイスを貰いましたがchompの使い道がよくわかりません。 そちらも説明していただけると幸いです。 わかりにくい質問ですがよろしくお願いします。

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

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

  • ベストアンサー
  • heburusu
  • ベストアンサー率85% (140/164)
回答No.1

こんにちわ。 概ね以下のような感じでしょうか。 1. STDINから入力を受け取る 2. chompで改行を削除 3. 連想配列に入力がキーとして存在するかチェック  3.1 存在する場合はlastでwhileループを抜ける  3.2 存在しない場合はwhileループを続行 ---------------------------------------------------------------------- my %hash = ("AP" => "Apple", "BN" => "Banana", "OG" => "Orange"); my $input = ''; print("好きな果物を入力してください[AP/BN/OG]"); while (defined($input = <STDIN>)){ chomp($input); if(exists($hash{$input})) { #入力がhashに存在するkeyならwhileを抜ける last; } print("3種類から選んでください”); } print("あなたの好きな果物は" . $hash{$input} . "ですね"); ---------------------------------------------------------------------- >また入力には<STDIN>を使い引数はchmopで処理すると良いとアドバイス >を貰いましたがchompの使い道がよくわかりません。 chompは変数(文字列)の末尾の改行を削除する関数です。 例えば、 >"好きな果物を入力してください[AP/BN/OG]" AP と入力すると$inputの中身は"AP\n"というように最後に改行文字が入っています。 改行文字が入っていると連想配列のキーのどれにも一致しなくってしまうので、 chompで削除する必要があります。

参考URL:
http://www.perlplus.jp/func/string/index10.html
shiro857
質問者

お礼

すいません。エラーの原因を突き止めることが出来ました。 わかりやすい回答、サンプルプログラムなどを書いていただきありがとうございました。 また次回もあればお願い致します。

shiro857
質問者

補足

回答有難うございます。 返信が遅くなってすいません。 ただいま実行してみたところこのようなエラーが出ました… Unrecognized character \xE3; marked by <-- HERE after print("<-- HERE near column 8 at ./ex13-1.pl line 14. このエラーはどこかに全角スペースが入っているということでしょうか。 もう一度書き直しましたがこのエラーを吐き続けています。

関連するQ&A

  • 連想配列からの値の取り出し

    お世話様です。 タイトルにもありますが連想配列を作成した後(以下に記述例)に その配列からキーを指定して値を取得したいと思っております。 array_keys関数だと値を指定してキーを取得するみたいで うまくいきませんでした。 何かよい方法ありませんでしょうか? //配列に格納 while (条件) {   $aParaOra += array((キー) => (値)); }

    • ベストアンサー
    • PHP
  • 以下のデータがあり、これをExcel VBAの連想配列として格納したい

    以下のデータがあり、これをExcel VBAの連想配列として格納したいと考えています。 MsgBoxでキーとアイテムを表示させると表示されるのですが、 最後に一例としてExistsで確認するとFalseが返ってきます。 これは配列に格納されていないのでしょうか。 また格納されていないとすると、どうすれば格納できるのでしょうか。 A 列   B列 35   apple 37   orange 40   banana 以下がコードです。 sub test() Dim i as integer Dim myDic as Object Dim keys as Variant Set myDic = CreateObject("Scripting.Dictionary") For i = 1 to 3 myDic.Add Cells(i, 1), Cells(i, 2) Next i keys = myDic.keys For Each keys In myDic MsgBox "キー名:" & keys & vbCr & "値:" & myDic.Item(keys) Next keys MsgBox myDic.Exists(35) End Sub

  • 連想配列の配列の使い方

    C言語でいうところの構造体の配列(要素は"hoge"と"fuga"のみ)を perlで表現する場合、連想配列の配列にするのが一般的でしょうか? 以下の様なソースコードなのですが、perlらしさが失われている気がします。 perlらしく書くとしたらどう書くのが良いでしょうか? [ソース] @list; #この配列の要素に連想配列を入れる sub input{ #list.txtの中にはhogeとfugaの値がカンマ区切りで記入されている open(IN, "list.txt");  $i = 0; while ($xx = <IN>) { ($list[$i]{"hoge"}, $list[$i]{"fuga"}) = split /,/, $xx; $i++; } close(IN); } sub output{ for($i = 0; $i <= $#list; $i++){ print $list[$i]{"hoge"}, $list[$i]{"fuga"}; } }

    • ベストアンサー
    • Perl
  • 配列に新しい値を加える

    配列に新しい値を加えようとしているのですが、どうもうまくいってくれません。array_push を使用してもうまくいかないのでどうしたものかと悩んでいます。 $fruits = "banana melon orange strawberry"; $fruits = explode (' ', $fruits); $fruits = array_push ($fruits, "apple"); print_r($fruits); とすると 5 が表示されます。一方3行目を消すと Array ( [0] => banana [1] => melon [2] => orange [3] => strawberry ) が表示されます。 配列に新しい値を加えるやり方をご存知の方おられましたらご教授くださるとうれしく思います。

    • ベストアンサー
    • PHP
  • 連想配列、オブジェクト配列の使い分け

    お世話になります。 データベースで結果を取得する場合など、連想配列のままではなく何故、わざわざオブジェクトに格納する様な手法が使われるのでしょうか? 連想配列のままで処理するほうが早いと思いますし、それに付随するクラスファイルも多くなります。また、「結びつきを緩くして仕様変更に耐えうる様に」など聞きますが、余計複雑になってしまう様な気がしますので、メリットが今ひとつ分からず判断に迷ってしまいます。 どの様な使い分け、考え方をすれば良いかアドバイスいただけたら幸いです。 何卒、宜しくお願いします。 例) ※必要と思われる部分のみ記述しております。 ■連想配列 while($row=mysql_fetch_assoc($res)){ ~以下必要な処理} ■オブジェクト配列 while($row=mysql_fetch_assoc($res)){ $example = new Example(); $example->setName($row['name']); $example->setAddr($row['addr']); $array[] = $example } ~以下必要な処理 ○モデル class Example { private $_name = null; private $_addr = null; public function __construct() {} public function setName($name) { $this->_name = (string) $name; return $this; } public function getName() { return $this->_name; } public function setAddr($addr) { $this->_addr = (string) $addr; } ~以下省略 }

    • ベストアンサー
    • PHP
  • 連想配列の処理

    こんにちは。 MySQL 4.1.22 と PHP 4.4.7 でプログラムを組んでいて、こちらではいつも皆様の知識と経験を参考にさせていただいております。 今回、どうしても超えられない壁に当たってしまいコーディングが止まってしまったので力をお貸し下さい。 今取り組んでいるプログラムは、複数の<checkbox>から選択した値を受け取って、マスターテーブルに検索を掛けて、返った値を表示した後、確認ボタンで別のユーザーテーブルに値を格納するというものです。 *** プログラムの流れ **** input.php(入力ページ:checkbox )  ↓ view.php (確認ページ:CC_master.tbl)  ↓ regist.php (登録ページ:user_master.tbl) input.php から値を取得して、 CC_master.tbl に検索・値の取得までは出来たのですが、取得した値を別の形に整形するところでつまづいてしまいました。 //--- input.php --- //--- 実際には 99個の checkbox がある訳ではありません。^^; <form name="form" method="POST" action="view.php"> <input type="checkbox" name="cc[]" value="1">50cc <input type="checkbox" name="cc[]" value="2">80cc <input type="checkbox" name="cc[]" value="3">125cc <input type="checkbox" name="cc[]" value="4">200cc <input type="checkbox" name="cc[]" value="5">250cc <input type="checkbox" name="cc[]" value="6">400cc   ・   ・(中略)   ・ <input type="checkbox" name="cc[]" value="99">その他 <input type="submit" name="exec" value="排気量の確認"> </form> //--- END Code --- //--- view.php --- //--- チェックされた排気量コードを CC_master.tbl に対して検索をかける //---例:1番、2番、6番にチェックを入れたとして... //---具体的な排気量を「 50cc 80cc 400cc 」の様に一列、スペース区切りで変数($cc_name)に格納、表示 $arr_cc = $_POST["cc"]; if(isset($arr_cc) and count($arr_cc) > 0){ $val = ""; for($i=0; $i<count($arr_cc); $i++ ){ if($i == 0){ $val .= $arr_cc[$i]; }else{ $val .= "," . $arr_cc[$i]; } } } $res = mysql_query("select * from CC_master where id in ('$val')"); while($row = mysql_fetch_array($res)){ # #ここで配列からフィールド:cc の値のみを取り出して、変数 $cc_name に格納。 # } ecoh $cc_name; //--- END Code --- //--- regist.php --- //--- $cc_name の値をINSERT文で user_master.tbl に登録。 現在、上記のように考えていますが、どうしても変数 $cc_name に意図した形で値を格納できません。 $val に値を入れる要領で処理すればOKだと思うのですが、while( )、for( )、foreach( ) のどれを使っても上手くいきません。連想配列となる $row["cc"] の扱い方(整形方法)がどうしても解らないで助けて下さい。 宜しくお願いします。 //--- CC_master.tbl --- CREATE TABLE `CC_master` ( `id` int(2) NOT NULL default '0', `cc` varchar(10) NOT NULL default '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=ujis; INSERT INTO `CC_master` (`id`, `cc`) VALUES (1, '50cc'), (2, '80cc'), (3, '125cc'), (4, '200cc'), (5, '250cc'), (6, '400cc'),   ・   ・(中略)   ・ (99, 'その他');

    • 締切済み
    • PHP
  • whileでの繰り返し表示

    すみません。C の初心者です。 while()で下記の内容を作成しようと しているのですが、putchar()を使わず 作成すると言う相談です。 また、prinrf()を使わないで 実行例が出来るのでしょうか? ※10が入力され場合の実行の時 ********** ←10個 0または負の値が入力されると、「*」は表示せず、改行のみを表示すること。 基本的事で恐縮ですが、初心者に分かり易く教えて下さい。

  • JavaScriptの連想配列について

    myArray = new Array();  myArray["A001"] = new Array();   myArray["A001"]["B001"] = "B001";   myArray["A001"]["B002"] = new Array();    myArray["A001"]["B002"]["C001"] = "C001";    myArray["A001"]["B002"]["C002"] = "C002";  myArray["A002"] = "A002"; JavaScriptの連想配列について質問させて頂きます。 例えば上記のような配列があったとして、値とキーはそのままで "C001" と "C002" の"B002"配列への格納順序だけ入れ替えたい場合、 どのように実装すればよろしいでしょうか? ちなみにキーや値はサンプルで実際にはsort出来るルールはありません。。。 ※入れ替え後のイメージ --------------------------------------------------------------------- myArray = new Array();  myArray["A001"] = new Array();   myArray["A001"]["B001"] = "B001";   myArray["A001"]["B002"] = new Array();    myArray["A001"]["B002"]["C002"] = "C002"; ←格納順序が    myArray["A001"]["B002"]["C001"] = "C001";  入れ替わった  myArray["A002"] = "A002"; ---------------------------------------------------------------------

  • FASTAファイルをperlでフォーマット

    >(DNA配列の描写 i.e.生物名、リファレンス番号) AGCAAAAGGGGGGGCCCCCCCCCCCCCCC 以下数行DNA配列が続く。 という繰り返しでできているFASTAファイルを 一列目を >(DNA描写) 二列目を一本のDNA配列 で表示させたい、と思っています。 while (<STDIN>){ if(/^>/){ print; }else{ chomp; chop; } }; print; としたのですが うまくいきません。 なぜなのでしょうか。

  • while文を使った問題なのですが・・

    はじめまして。 C言語初心者です。 while文のところまでやっとたどり着きましたが、次の問題がどうしても解くことができません。 ********************** 整数を入力し、入力された整数の数だけ「*」を横一列に表示し、最後に改行するプログラムを while 文を使って作りなさい。 但し、0または負の値が入力された場合は、「*」は表示せず、改行のみを表示すること。 ********************** #include<stdio.h> int main(void) { int a; scanf("%d", &a); while(a!==0){ printf("%d*\n", a); } } こんな感じでつくってみたのですが、whileの条件部分がさっぱり分かりません。 int a の数字文だけ、*で表示する、というのも方法が思いつきません。 アドバイス、お願いいたします。