ハッシュのキー追加で機能追加を行いたいがうまくいかない

このQ&Aのポイント
  • 既存のプログラムに機能追加を行いたいが、ハッシュのキー追加について困っています。
  • ハッシュのキーには%や$などの記号が含まれており、どう対応すればいいかわかりません。
  • 具体的なソースコードを示し、どこが間違っているのか教えていただきたいです。
回答を見る
  • ベストアンサー

ハッシュのキー追加について

とある既存プログラムに機能追加したいのですが上手くいきません。 ハッシュだとは思うのですが、%だったり$だったりしてよくわからなくなってしまいました。 どこがおかしいか教えていただけないでしょうか。 <概要> もともとあった(1)と(3)の処理の間に、(2)を行う <ソース> (1)DBから1レコードを取得する $sql = "select * from tenpo where id=5;"; $sth = $dbh->prepare($sql); $sth->execute(); $shop = $sth->fetchrow_hashref(); (2)別TABLEから値を取得し、(1)に追加する $sql = "select todoufuken from area where id=5;"; $sth = $dbh->prepare($sql); $sth->execute(); @todoufuken= $sth->fetchrow_array; $shop{place} = $todoufuken[0]; (3)$shopの情報をサブルーチンに渡す ソース略

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

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

  • ベストアンサー
  • pick52
  • ベストアンサー率35% (166/466)
回答No.1

とりあえず、見た感じで間違っていそうなのは以下。 $shop{place} = $todoufuken[0]; ↓ $shop->{place} = $todoufuken[0]; どうやらハッシュのリファレンスっぽいので。 あとは分かりません。

noname#102084
質問者

お礼

回答ありがとうございます。 まさにご指摘いただいた部分でした。 ハッシュの宣言がされずに稼動しているのが気になっていたのですが、リファレンスだったのですね。 本当にありがとうございました。

関連するQ&A

  • fetchrow_arrayとfetchrow_hashrefの使い方

    Jやまとです。 PerlからSELECT文を実行して結果の行の値を取得する単純なスクリプトを作成しています。 (1)fetchrow_array使用 (2)fetchrow_hashref使用 以上2通りの方法で試したのですが、(2)がInternal Server Errorになります。 原因が全く分かりません。 分かる方いらしゃいましたら、ご教授願います。 OS:TurboLinux6.2 DB:Oracle8i Apache,PerlはTurboLinux6.2に入っているものをそのまま使用 以下、ソースを記載します。 --------------- (1)fetchrow_arrayを使用して行の値を取得(こっちは動く) $dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr); $sql = "SELECT SYSDATE FROM DUAL \n"; $sth = $dbh->prepare( $sql ); $sth->execute or die "Cannot execute. " . $sth->errstr(); $cnt1 =1; while (@row = $sth->fetchrow_array()) { @{$get_date[$cnt1]} = @row; $cnt1++; } --------------- (2)fetchrow_hashrefを使用して行の値を取得(こっちが動かない) $dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr); $query = qq{ SELECT SYSDATE FROM DUAL }; $sth = dbh->prepare($query); $sth->execute(); # 実行 if($sth->rows() != 1){ # 該当する行数 # エラー処理 } $rhash = $sth->fetchrow_hashref(); %hash = {%{$rhash}}; $sth->finish(); $get_date = $hash{SYSDATE}; --------------- (2)実行時のerror_log Can't locate object method "prepare" via package "dbh" at /u01/ora1/www/htdocs/hoge.cgi line 30. Premature end of script headers: /u01/ora1/www/htdocs/hoge.cgi --------------- (本文長くてすみません)

    • ベストアンサー
    • Perl
  • Mysqlの接続について

    現在、以下のようなperlのスクリプトを作っているのですが、mysqlへの接続,切断は以下の場合、どちらにした方がいいのでしょうか? (1)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (2)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $dbh->disconnect; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (1)の場合と(2)の場合の違いは、(1)の場合、最初にデータベースに接続して、一番最後に切断する事で、(2)の場合、毎回データベースへの接続と切断を行う事が違います。 (2)の場合、毎回接続と切断を行うので、2回ほどではあまり変わらないかもしれないのですが、もし10回とか接続と切断を行うとかなり負荷が高くなるような気がするのですが、他のHPなどを拝見すると接続をしたら切断を行うように癖をつけるようにした方がいいと書かれていたりします。 どちらの方が正しいやり方というか、負荷がすくなく使えるのでしょうか?

    • ベストアンサー
    • Perl
  • 最大値の数をカウントしたい

    初心者ですが、よろしくお願いします。 Pointの最大値を持つレコードの件数をカウントするために、 $sth = $dbh->prepare(SELECT COUNT(MAX(Point)) FROM table); $sth -> execute(); $count = $sth -> fetchrow_array(); としたのですが、うまくいきません。 COUNT()の中にMAX()を入れられないのでしょうか? だとしたらどのように書けば動くようになるでしょうか? 初歩的な質問かもしれませんが、いろいろ調べてもよくわかりません。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLで別テーブルの参照

    こんにちは。 PostgreSQL+Perl+DBIでCGIを書いています。 テーブルからデータを取得する場合なのですが、table1にはIDのみが登録されていて、table2には、そのIDに対する文字列が登録されているとします。 このような場合に、tableからIDを取得して、そのIDに対するtable2の文字列を一気に取得することは可能でしょうか? つまり、 $dbh=DBI->connect(~); $sth=$dbi->prerare("SELECT id FROM table1 WHERE ~;"); $sth->excecute(); $id=$sth->fetchrow; $sth->finish(); $sth=$dbi->prerare("SELECT str FROM table2 WHERE id=$id;"); $sth->excecute(); $str=$sth->fetchrow; $sth->finish(); $dbh->disconnect(); といった処理をこんな感じに一度に行いたいのです。 $dbh=DBI->connect(~); $sth=$dbi->prerare("~~~~~;"); $sth->excecute(); $str=$sth->fetchrow; $sth->finish(); $dbh->disconnect(); 可能かどうかもわからないのですが、なにか良い方法はありますでしょうか?よろしくお願いします。

  • pdoでバインドしない場合のデメリット

    $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->bindParam(':calories', $calories, PDO::PARAM_INT); $sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12); $sth->execute(); 上記ではなく $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?'); $sth->execute(array($calories,$colour)); のようにbindParamやbindValueを使わない場合は危険はあるのでしょうか? ご教示頂けますと幸いです。 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • PHP(prepareについて)

    html(fromタグ)→php(fromの受取)→db(データベース)→php(出力) ということをやりたいのです。htmlからの送信はできているのですが、 エラーがphp文の中にあるexecute();メゾッド部分に起こります。どうすれば直りますか? PHP <?php try{ $dbh=new PDO("mysql:dbname=blog;host=localhost","root",""); $sth=$dbh->prepare("select * from id where id=:id"); $sth=$sth->bindValue(":id",2,PDO::PARAM_STR); $sth=$sth->execute(); $result=$sth->fetchALL(); print_r($result); }catch(Exception $e){echo $e->getMessage();} ?>

    • ベストアンサー
    • PHP
  • MySQLとの接続でfetchrow_arrayがwhile文で使えない

    こんばんは、皆さん。 MySQLをPerlから使いたいのですが、 以下のようにやっても、$flagに"OK"が入りませんでした。 つまり、whileは一度もループしないで抜けてしまっているようです。 ------------------------------------------------- use DBI; … sub dbtest{ $dbh = DBI->connect("dbi:mysql:hogeDB:localhost","user","pass"); $sql = "select hoge,fuge from t_name where key='value'"; $sth = $dbh->prepare($sql); $sth->execute; while( ($hoge, $fuge) = $sth->fetchrow_array ){     $flag = "OK"; } $sth->finish; $dbh->disconnect; } ------------------------------------------------- ※実際はユーザ名などは変数にしています。 バージョンは現在、 Perl:v5.8.5 MySQL:5.1.6-alpha となっているようです。 それとちょっと別件ですが、 use autouseの書式は以下でよいのでしょうか? 「use autouse DBI;」 しかし、これだけだとDBIが読み込めてないエラーになるようです。 ご教示よろしくお願いします。

    • ベストアンサー
    • Perl
  • mysqlへの接続でつまづいてまーす

    Perlのプログラムでログイン画面を作ろうと思っています。 ブラウザのログインフィールドからデータをとり、mysqlに接続してDBを検索し、照合するデータを見つけたら、合致するかどうか判断させて、エラーもしくはHPへ入ってしまえよ!という感じです。 で、似たようなサンプルソースを見つけていじっているのですが、これが出来ないんですよね~。接続だけなら出来るのに・・・ とりあえずこの中にエラーがないか教えてほしいです(>_<) if($i_id eq "" || $i_pw eq ""){ print "ログイン情報を入力してプリーズ(´д`;)ノ"; }else{ $dbh = DBI->connect($dbn,$user,$pw); $dbh->do("SET NAMES sjis"); $rows = $dbh->selectrow_array("SELECT count(*) from list where id = $i_id"); if($rows == 0){ print "該当するデータはないっすね~(゜*゜)"; }else{ $sth = $dbh->prepare("SELECT * FROM list where id = $i_id"); $sth->execute(); print <<"html"; 検索結果一覧<br><br> <table border="1"> <tr bgcolor="#dddddd"> <td>学籍番号</td> <td>パスワード</td> </tr> html while (@row = $sth->fetchrow_array()){ print <<"html"; <tr> <td>$row[0]</td> <td>$row[1]</td> </tr> html } print "</table>\n"; } ※ちなみにこれは一部です・・・

  • 一回の処理で、2回以上データベースに対してアクセスできない??(perlDBIを使用)

    質問があるのですが、よろしくお願いします。 use DBI; $dbuser = 'root'; $passwd = 'abc'; $db = DBI->connect('DBI:mysql:DB:localhost',$dbuser, $passwd); $prepare = "select MAIL from user where USER_ID = $userid"; $sth->prepare("$prepare"); $sth->execute; @user = $sth->fetchrow_array; $sth->finish; while( ($key, $value) = each %in ){ $sth = $db->prepare("UPDATE user SET $key = '$value' where USER_ID = $in{userid}"); $sth->execute; $sth->finish; } $db->disconnect; という処理を行わせたいのですが、どうもUPDATE文の辺りで、処理が止まってしまっているようなのです。select文はしっかり実行されている形跡があるのですが、1回の処理で2回以上データベースに対してアクセスすることは出来ないのでしょうか? どなたか分かる方いらっしゃいましたらご教授のほどよろしくお願いします。

    • ベストアンサー
    • MySQL
  • カタカナ「ソ」の文字化けについて

    いつもお世話になります。 現在Shift-JIS環境でCGIを動作させているのですが、データベース(shift-jis)内に「ヒソカ」という文字列があり、この文字列を、 読み込んで→再度書き込み 【ソース】 $SQL = $dbh->prepare( qq{ SELECT * FROM User WHERE `id` = "$in{'id'}" }) $SQL -> execute(); @DATE = $SQL ->fetchrow_array(); ※@DATE [0]にその文字列が入っています。 (varchar(30)) とした際「ヒャJ」となります。 恐らく「http://www.shtml.jp/mojibake/sjis_cgi.html」で書かれている問題だと思うのですがどうにか対処する方法はないでしょうか。 何卒よろしくお願い致します。

    • ベストアンサー
    • CGI

専門家に質問してみよう