連想配列の評価とは?

このQ&Aのポイント
  • 連想配列の評価については文中では詳細な情報は提供されていないが、DBから値を読み込んで評価しているようである。
  • ただし、前任者がいないため、具体的な評価方法は不明である。
  • %P3という連想配列に関連する変数($wd1, $wd2, $wd3)が存在する場合、それに対応する値を代入してから処理が行われる可能性がある。
回答を見る
  • ベストアンサー

連想配列の評価

DBより値を読込み、評価しているようですが 前任者がいないので、どう評価しているかわかりません。 -------------------------------------------------- tie(%P3, DB_File, $P3_FILE, O_RDONLY, 0444, $DB_BTREE) || die "$P3_FILE: $!"; if (defined($p3 = $P3{$wd1, $wd2, $wd3})) { ・・・ } -------------------------------------------------- これは、%P3に $wd1か$wd2か$wd3が存在したら それに対応する値を代入してから、処理を行うと 考えていいのでしょうか?

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

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

$P3{$wd1, $wd2, $wd3} は、多次元配列をハッシュを用いて表現する古い書き方です。(Perl4で使われていたがPerl5でも使えます) 例えば、 $;=";";#説明の為に可読の文字にしただけで規定値は違います としたとき %data=("X;Y;Z", 123); というハッシュがあれば(つまりキーが"X;Y;Z"、値が123ということ) $data{"X","Y","Z"}というように指定して取り出せます。 なので、$wd1か$wd2か$wd3が存在したら という意味ではありません。

ttttttttttttttta
質問者

お礼

連想配列はキーと値が1対1だと思っていました。 キーが複数存在する場合もあるのですね。 ありがとうございました。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

実際に、次のようにして試してみるといいです。 $code=ord $;; printf "10進:%d,16進:%X",$code,$code;

ttttttttttttttta
質問者

お礼

ありがとうございました! ようやく上手くマッチさせることが出来ました!

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2補足>実際なんの文字コードになるかご存知ですか? アスキーコードで0x1C (\034)です

参考URL:
http://www.shibu.jp/cppreference/ascii.html
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>連想配列はキーと値が1対1だと思っていました。 >キーが複数存在する場合もあるのですね。 キーは1つです。 {}の中に,で区切った内容については、($;の値で) 連結して(1つの)キーになるのです。

ttttttttttttttta
質問者

お礼

なるほど、そういうことですか。 参考になりました。 ありがとうございます。

ttttttttttttttta
質問者

補足

実は、上記のコードをCに落としているのですが $;というのがカンマかと勘違いしていました。 これは実際なんの文字コードになるかご存知ですか?

関連するQ&A

  • DBファイルが0644になってしまう

    Linuxで perl5.005_03 + AnyDBM_FileでDBを作ろうとしているのですが、 作成された DBのファイルパーミッションが「0644」になってしまいます。 「0444」だと意味はありませんが正しく設定されます。 「0777」だと「0744」になりました。 以下のようにやっているのですが、何が間違えているのでしょう。 それとも操作に関しての権限が「0666」になるだけで、実際のファイル パーミッションは後から変更しないといけないのでしょうか? ---------------------------------- use Fcntl; use Config; use AnyDBM_File; $flags = O_CREAT | O_RDWR | &BINARY; tie( %HASH, AnyDBM_File, dbmfile, $flags,0666 ) || die "Can't open DB\n"; ~処理~ untie( %HASH ); sub BINARY{ return O_BINARY if $Config{osname} =~ /^(MS)?Win/; }

    • ベストアンサー
    • Perl
  • DBMの容量制限

    DBモジュールを使ってちょっとしたDBを作ってるんですが、容量制限 らしきものでひっかかってます。そう、1024byteの壁です。これを越えると sdbm store returned -1, errno 22, key "0012018" at ./hoehoe.pl line ~. と叱られてしまうのです。 他にもODBMはもちろんのこと、NDBMも試しましたが結果は同じです。 容量制限のない GDBM、DB_Fileは大丈夫でした。 しかし SDBM、NDBMは 4096byteまで大丈夫だったはず。なにか別の方法が あるのでしょうか? 今回の試しに以下のものを書いてみました。「3000」を「1000」くらいに すると通ります。DB_File、GDBMでは「3000」でも大丈夫です。 ---------------------------------------- use Config; use Fcntl; use SDBM_File; $flags = O_CREAT|O_RDWR|&BINARY; tie( %HOE, 'SDBM_File', 'hoe', $flags, 0666 ) || die "Can't open DB"; $uiui .= 'UIUI' while( 3000 > length( $uiui )); $HOE{'key'} = $uiui; untie( %HOE ); print "ok\n"; exit; sub BINARY{ return O_BINARY if( $Config{osname} =~ /^(MS)?Win/ ); }

  • DBMのことで・・・

    現在DBMを用いて簡単なデータベースを作成しています。 どこぞのCGIゲームのように、リアルタイムにデーターベースの内容が書き換えられる(戦闘をすればお金がプラス等)ようにしたいのですが、うまくいきませんorz #!/usr/bin/perl use AnyDBM_File; use Fcntl; print "Content-type: text/html\n\n"; dbmopen(%DBM, 'id', 0666); $DBM{"baka"} = ("0<>1<>2<>"); dbmclose(%DBM); print<<"HTMLTAG"; DBを作成しました HTMLTAG tie %DBM,AnyDBM_File,"id",O_RDONLY,0666; @aaa = split(/<>/,$DBM{"baka"}); untie %DBM; print"$aaa[0]"; $aaa[0]++; とりあえずこのスクリプトで、ブラウザの更新をおすたびに表示される数字が1あがっていく(プラスされて書き換えられる)ようにしたいのですが・・・ 多分ですがゲーム等の場合、いちいちdbmopenで書き換えてないとおもうので、その方法を知りたいというわけです。 いちおうこの段階ではDB作成、DBの読み込みと表示はできています。 ご教授おねがいします。

  • MYSQLからCSVへの書き込み方法

    MYSQLからCSVへの書き込み方法で質問があります。 下記のコードを記載しましたが DBのデータ件数分の改行しか出力されませんでした。 ブラウザ上でecho動作させた際には、 echo "<p>CSVファイルにセットされるデータ:".$string; でしっかりデータが設定されていました 何が悪いですか? ////////////////////////////////////////////////////////////////// // DBからCSVファイル書き込み(全件新規) // $file_name:csvファイル名 ////////////////////////////////////////////////////////////////// function DB_csvSet($file_name, $dbhost=DBHOST, $dbuser=DBUSER, $dbpass=DBPASS, $dbname=DBNAME) { print "DB_csvSet start"; // MySQL 接続 if (!($cn = mysql_connect($dbhost, $dbuser, $dbpass))) { die("DB_csvSet Error: mysql_connect"); } //MySQLのクライアントの文字コードをsjisに設定 mysql_query("SET NAMES sjis") or die("can not SET NAMES sjis"); // MySQL DB 選択 if (!(mysql_select_db($dbname))) { die("DB_csvSet Error: mysql_select_db"); } // MySQL 問い合わせ $sql = sprintf("select * from %s", TABLE_NAME); if (!($rs = mysql_query($sql))) { die("DB_csvSet Error: mysql_query"); } // ファイルを新規モードで開く $file = fopen($file_name, "w") or die("OPENエラー $file_name"); // ファイルをロックする flock($file, LOCK_EX); // MySQL レコード参照 while ($item = mysql_fetch_array($rs)) { printf("id=%s ", $item[ITEM_ID]); printf("name=%s ", $item[ITEM_NAME]); printf("point=%s<BR> ", $item[ITEM_POINT]); // 3つの変数から配列を作成する $array = compact($item[ITEM_ID], $item[ITEM_NAME], $item[ITEM_POINT]); // $array = compact("id","name","point"); // 配列のデータをカンマで区切って結合する $string = implode(",", $array); // 結合された文字列を表示する echo "<p>CSVファイルにセットされるデータ:".$string; // データを書き込む fputs($file, $string."\n"); } // ロックを解除する flock($file, LOCK_UN); // ファイルを閉じる fclose($file); // MySQL 切断 mysql_close($cn); // 正常終了 print "正常終了"; }

    • 締切済み
    • PHP
  • ファイルの配列のリストデータ(変数)の特定の変数の値だけを変えたい。

    サブルーチンの下のコードで表題の事をやろうとしていますが、 1)値が変わりません。($sinkou) 2)「エラー2','メッセージファイルが開けませんでした.」と表示されてしまいます。 3)モジュールで実現する方法がアったら教えてください。 よろしくお願いします。 sub SET_sinkou{ my($number,$name,$sinkou,@new,$line,$hanabi,$sinkou2); $lockfile = "$tmp_dir$cmd{'log'}\.lock"; &lock; if (!open(DB,$message_file)) { &Error('エラー1','メッセージファイルが開けませんでした.'); } while(<DB>){ ($number,$name,$sinkou) = split(/\t/,$_,3); if($number == $_[0] ) { $sinkou = $_[1]; $sinkou2 = $_[1]; #チェック用 $hanabi='花火'; #チェック用 $line=join(' ',$number,$name,$sinkou); push @new,$line; } else{ $line=join(' ',$number,$name,$sinkou); push @new,$line; } } close DB; if (!open(DB,">$message_file")) { &Error('エラー2','メッセージファイルが開けませんでした.'); } foreach(@new){ print DB $_; } close(DB); unlink($lockfile); &Html_head; print <<"EOF"; $body <h2><strong>変更しました。$sinkou=$sinkou=2=$_[0]=$_[1]=$hanabi</strong></h2><p> <!--$sinkou=$sinkou=2=$_[0]=$_[1]=$hanabiは値のチェック用--> </body></html> EOF }

    • ベストアンサー
    • Perl
  • PHPでMySQLへの接続

    お世話になります。 phpを用いてMySQLへ接続したのですが、データが空で戻ってきました。lowは件数表示されましたし、行数もその分返ってきています。何か原因は考えられるでしょうか? <html> <head> <title>PHP TEST</title> </head> <body> <?php $link = mysql_connect('localhost', 'XXXX', 'XXXX'); if (!$link) { die('接続失敗です。'.mysql_error()); } print('<p>接続に成功しました。</p>'); $db_selected = mysql_select_db('XXXX', $link); if (!$db_selected){ die('データベース選択失敗です。'.mysql_error()); } print('<p>uriageデータベースを選択しました。</p>'); //mysql_set_charset('utf-8'); $result = mysql_query('SELECT * FROM sample'); if (!$result) { die('クエリーが失敗しました。'.mysql_error()); } while ($row = mysql_fetch_assoc($result)) { print('<p>'); print('id='.$row['str']); print(',name='.$row['etc']); print('</p>'); } $close_flag = mysql_close($link); if ($close_flag){ print('<p>切断に成功しました。</p>'); } ?> </body> </html>

    • ベストアンサー
    • PHP
  • definedの使い方が間違ってますか?

    こんばんは。 色々試してみたのですが、どうしてもうまくいかないので質問させてください。 リストの$f1とファイルの$aaがマッチして、 かつリストの$f3とファイルの$bbがマッチした場合に、 $f4を付け加えてprintしたいのですが、 ★マークの処理で、リストの$f3とファイルの$bbがマッチしていないものまで printされてしまうことがあります。 $aaとマッチするものがリストに2つ以上ある時にこの現象がおきるようなのですが、 どの辺を直したらよいのかわかりません。 definedの使い方がおかしいのでしょうか? 見よう見まねで書いたので、▲マークあたりの指定も自信がありません。 #リスト読み込み open LIST, "./list" or die; while (<LIST>) { chomp; if (/(.*) (.*) (.*) (.*)/) { $f1 = $1; $f2 = $2; $f3 = $3; $f4 = $4; } $xx{$f1} = $f4; #▲ $yy{$f1} = $f3; #▲ } close LIST; #ファイル読み込み if ($#ARGV >= 0) { @files = @ARGV; } foreach $file (@files) { open FILE, $file; while (<FILE>) { chomp; if (/^([^t]+)\t(.*)$/) { $aa = $1; $bb = $2; if (defined($xx{$aa})) { if (defined($yy{$bb})) { # ★ print "$aa\t$bb\t\#【$xx{$aa}】\n"; } } } } close FILE; } どうかご教示お願いいたします。

    • ベストアンサー
    • Perl
  • cronでバックアップsh

    現在、hetemlというレンタルサーバでバックアップ用のシェルをcron登録しているのですが、 権限エラーが出てしまいます。何の権限エラーなのか解らないのですが、 どなたかご存知ないでしょうか? [エラーメッセージ] /bin/sh: /home/sites/heteml/users/xxx/db_bakkup.sh: Permission denied [シェル] #!/bin/sh # ---------- 設定 ---------- # バックアップ元のデータベース db_host=xx db_name=xx db_user=xx db_pass=xx # バックアップ先のディレクトリ・ファイル bk_file=/xx/bak.sql # ---------- ファイル名を設定 ---------- # ファイル名を設定 file_temp=$bk_file.sql # ---------- バックアップ処理 ---------- # バックアップ先のディレクトリに移動 cd $bk_dir if [ $? != 0 ]; then echo "Backup directory does not exist." exit 1 fi # データベースをダンプ mysqldump -h$db_host $db_name -u$db_name -p$db_pass --opt > $bk_file if [ $? != 0 -o ! -e $file_temp ]; then echo "Cannot dump database." exit 1 fi exit 0 ------------------------------------ 有識者の方、ご教授お願い致します。

  • フォームから送信した値とMySQLの値と比較したい

    PHP初心者です。 フォームから送信した値とMySQLの値を比較したいのですが、行き詰まっています。 以下の、”//(1)↓”のところが動作しません。どなたか助けていただけないでしょうか? MYSQLの値は1レコードのみの抽出し、そのカラム”seikai”と、フォームから送信された”rad”と比較したいのです。 <?php //区画 $kukaku = "1"; // ファイルインクルード include("db.php"); // データベース接続 $conn = mysql_connect($host, $user, $pw) or die("データベース接続エラー"); mysql_select_db($db, $conn) or die("接続エラー"); // データ抽出 $sql = "SELECT * FROM $table where id = '$kukaku'"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); // データを受け取る $rad = @$_POST["rad"]; ?> <table width="200" border="1"> <?php while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { ?> <tr> <td>DBの正解<?php echo $row["seikai"]?><br> 送信された答え=<?php echo $rad?> </td> </tr> <?php } ?> </table> <?php if ($rad == ""){ echo "<p><font color=#FF0000><b>答えを選択して下さい!</b>"; echo "<p><a href=\"form.php\">戻る</a>"; exit (); } //(1)↓ if ($seikai == $rad){ echo "<p><font color=#FF0000><b>正解です!</b></font>"; exit (); } // 接続解除 mysql_close($conn); ?>

    • ベストアンサー
    • MySQL
  • MySQLに日本語を登録すると文字化けする

    お世話になります。 PHPを使用して日本語文字を登録しようとすると文字化けします。 どこをどのようにすれば文字化けはなおるのでしょうか? ソースは以下で書いています。 よろしくお願いします。 <?php function blank($value){ if(isset($value)){ if(is_array($value)){ return count($value)==0; }else{ return $value==""; } } return true; } if(blank($_POST["phonenumber"])||blank($_POST["password"])||blank($_POST["name"])||blank($_POST["mail"])){ ?> <p>名前、E-mail、携帯番号またはパスワードを入力してください</p> <p><a href="input.html">戻る</a></p> <?php }else{ $name= $_POST["name"]; $mail= $_POST["mail"]; $phonenumber = $_POST["phonenumber"]; $password= $_POST["password"]; $link=mysql_connect("localhost","id","password"); if(!$link){ die("データベースに接続できません"); } $db=mysql_select_db("id"); if(!$db){ die("データベースを選択できません"); } $sql=<<<SQL insert into password(phonenumber,password,name,mail)value("{$phonenumber}","{$password}","{$name}","{$mail}") SQL; $result=mysql_query($sql,$link); if(!$result){ die("同じ携帯番号で登録済です。"); }else{ print("正常に登録が終了しました"); } } ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう