CGIを改造中です。
変数の処理なのですが、サブルーチン内で利用するときに「$in{'~'}」と言う形でしか表示してくれません。これを「$~」の形にしたいです。
数が少なければ「$~ = $in{'~'}」を個数書けばいいのでしょうけど、結構数があるので、何か簡単な方法で変換できないかと考えています。
良い方法があれば教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

ハッシュのままで何か不都合があるのかなと


疑問に思いつつ・・・
#実際ハッシュは
#「(変数の)値に別の値を対応させる」
#ために存在するわけだから

けど,まあ,やろうと思えばkeys関数でできますよ.

%in=(
'X' => 1,
'Y' => 2,
'Z' => 3,
);

for $key (keys %in){
${$key}=$in{"$key"};
print "key; $key ${$key}\n";
}

print "$X $Y $Z";

strictとwarningsのプラグマを外さないといけないので
副作用の方が大きいでしょうが.

この回答への補足

すみません。方法が良くわからないのですが…

やりたいことは#1さんへの補足に記入してあります。

手順としては…
新規データ記入フォーム→ログへの書き込み→html出力。
この場合、$~でhtml出力サブルーチンへデータが移動します。
修正データ入力→ログへの書き込み→記事Noのhtmlファイル削除→html出力。
この場合、$in{'~'}で修正サブルーチンへデータが移動します。

と言うことで、html出力の手前で「$~ = $in{'~'}」と言う処理をさせたいです。
何か良い方法は無いでしょうか?

補足日時:2007/07/02 00:34
    • good
    • 0

#2 の strictとwarnings の話は、無視して構いません。



このキーワードで”ピン”とくる人だけに
対しての注意書きです。
    • good
    • 0

「$~ = $in{'~'}; を実行する」のが (基本的には) #2 の for 文なんだけどなぁ. だから, #2 を試せば問

題は氷解するはずなんだけど....
    • good
    • 0

私はPerlしか知らないので、そのCGIスクリプトがPerlであれば、の話になってしまいますが・・・



格納先はスカラー変数じゃないとダメなのでしょうか?
だとすると($one,$two,$three,$four,$five....)=values %in;
という方法しか私には思いつかないです・・・。
配列でもよければ、
@form=values %in;
で一気に格納できるのですが・・・。

この回答への補足

返答ありがとうございます。

現在、データベース的なものを作ろうとしています。
そして、その結果(レコード)をhtml出力しようとしています。

その「htmlファイルに出力」をする際、「新規作成」と「修正」の処理をさせる必要がありますよね。
html作成部分を、「新規作成」と「修正」の部分で共用しようと考えています。
しかし、「新規作成」の時は「$~」でちゃんと出力するのですが、修正時は「$in{'~'}」でないと出力してくれません。

その為、「$in{'~'}」を「$~」の形に修正する必要があります。

さて、ご指摘のとおり、やってみたのですが、どういう法則かわからないのですが、うまく当てはまりません。ずれて保存されている感じです。(もしかして、フォームの順番順?)
その他の方法があればお願いします。

補足日時:2007/07/01 23:39
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qfetchrow_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
---------------
(本文長くてすみません)

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を使用して行の値を取得(こっちは...続きを読む

Aベストアンサー

rowsメソッドと同じく、executeが正しく処理レコード数を返すのは、非select文を実行した場合のみです。
select文の場合、rowsもexecuteも0行と認識するDBDが多いです。
で、これはselect文に限らずですが、処理レコード数が0の場合は、0自体ではなく「0E0」を返します。
これは、0を返すと、実行エラー時の戻り値undefと同様、
if ($sth->execute) {} で失敗したのと同じことになってしまうためです。
select文の行数は、fetchしながら行数をカウントするか、取り込んだ、配列、ハッシュの数をカウントするのが一般的な方法ですね。fetchする前に取得する方法はわかりません。

Qperlを使ってレコード件数を取り出してみると、すごい数が・・・。

perlのDBIモジュールを使って、mysqlのレコード件数を表示させてみると、すごい数が表示されました。ソースは以下の通りです。
use DBI;
$dbh=DBI->connect("DBI:mysql:データベース名:サーバ名", "ユーザ名", "パスワード") || die $DBI::errstr;
if(!$dbh){
print "エラーです。入力を確認してください。";
exit;
}else{
#接続成功

# SELECT文発行
$sth=$dbh->prepare("SELECT sei, mei, mail FROM table");
#実行
$sth->execute;
$num_rows = $sth->rows;
print "該当 $num_rows, 件\n";

# 開放
$sth->finish;
# AUTO COMMITがOFFの場合はCOMMITが必要
$dbh->commit;
# 切断
$dbh->disconnect;
}

実行すると該当 4294967294, 件 とブラウザに表示されました。僕はレンタルサーバを使っているわけですが、僕のデータベースにはレコードは3件しかないのです。これはレンタルサーバのデータベースすべての件数が表示されているのでしょうか?
なんだかSQLを実行するのが怖いので、考えられる原因を教えてください。よろしくお願いします。
プログラムを初めてまだ、数ヶ月しか経ってない初心者なので、みなさんの知恵を貸していただけると幸いです。

perlのDBIモジュールを使って、mysqlのレコード件数を表示させてみると、すごい数が表示されました。ソースは以下の通りです。
use DBI;
$dbh=DBI->connect("DBI:mysql:データベース名:サーバ名", "ユーザ名", "パスワード") || die $DBI::errstr;
if(!$dbh){
print "エラーです。入力を確認してください。";
exit;
}else{
#接続成功

# SELECT文発行
$sth=$dbh->prepare("SELECT sei, mei, mail FROM table");
#実行
$sth->execute;
$num_rows = $sth->rows;
print "該当 $num_rows, 件\...続きを読む

Aベストアンサー

こんにちは。

まず、全然関係ないですが、SELECT文ではCOMMIT不要です。
さて本題ですが、この場合のrowsは何が返るかわかりません。
rowsでレコード数を取り出せるのは下記の場合のみです。
1.doメソッドで実行した場合(条件付き)
2.SELECT以外のSQL。
3.SELECT実行後、すべての行を取り出した後。

ところで、件数取得はCOUNT()じゃダメ?
(^^ゞ


人気Q&Aランキング

おすすめ情報