みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Perl の use strict に付いて

●HTML

<html><head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>テスト5(UTF-8)</title>
</head>
<body>
<form action="test5.cgi" method="post" >
<input type="text" name="f1" value="" size="80">
<button type="submit" >送信</button>
</form>
</body></html>

——————————————————————————————————————

●Perl

#!/usr/bin/perl
#use strict; ※問題の行1
use warnings;
use CGI;

print "Content-type: text/html\n\n";
print "<meta charset=\"UTF-8\">\n";

# POST / GET パラメータを取得-------------------------
my $q = new CGI;
# パラメータ名を指定して取得する
my $param1 = $q->param('name1');
my $param2 = $q->param('name2');
# FORM値の取得-----------------------------------
# 全てのパラメータを取得する
for my $param_name ($q->param) {
print $param_name . ' = ' . $q->param($param_name) ;
print "<br>\n";
${$param_name} = $q->param($param_name); ※問題の行2
}
#-------------------------------------------------
print "テスト<hr>\n";
print "$f1<br>\n";
exit;
——————————————————————————————————————

【質問】
「※問題の行1」+「※問題の行2」 = エラー
「※問題の行1」のみ = 正常に動きます
「※問題の行2」のみ = 正常に動きます

「※問題の行1」の「use strict; 」と
「※問題の行2」の「${$param_name} = $q->param($param_name); 」
をどう書き換えれば、二つとも記述したまま正常に動くのでしょうか?
よろしくお願いします。

投稿日時 - 2019-02-04 11:38:34

QNo.9584539

困ってます

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

${$param_name} = ~;
は、$param_nameに入っている文字列をそのまま $変数名にする命令です。

一方、use strict; は 宣言されていない変数名(等)の使用を禁止する命令ですので
上記の フォームからやってきた任意のname値をそのまま変数名にするということと
相反しております。
(これが 行1と行2が同時に記述できない理由です)

なお、${$param_name} = ~; という記述方法は、CGIでは使わないほうがよいです。
というのは、GET/POSTデータとしては、任意のnameを擬装して送れてしまうので
故意の攻撃 または不注意で プログラム内で使っている別の変数を
上書きでき、不測の事態を起こしかねない、かなり危険なコーディングですので。

なので
${$param_name} = のような 自動的に変数を作るような記述はしないで
予め作っておいたハッシュに代入する ほうがよいと思います。

具体的には

  # FORM値の取得-----------------------------------
  # 全てのパラメータを取得する
の以降を
my %form_data = (); #ハッシュの宣言
for my $param_name ($q->param) {
print $param_name . ' = ' . $q->param($param_name) ;
print "<br>\n";
$form_data{$param_name} = $q->param($param_name); #ハッシュへの代入
}
#-------------------------------------------------
print "テスト<hr>\n";
print "$form_data{'f1'}<br>\n"; #ハッシュの取り出し
exit;

にされては如何でしょう。

投稿日時 - 2019-02-05 23:02:07

お礼

教えていただいた通り書き直したら上手く動きました。

UTF-8、始めたばかりで
ECUとかshift-jisと違うとこ多くて
参考になるサイトも少なくて難しいです・・・(T ^ T)

「ハッシュの宣言」と言うのも初めて知りました(汗;)

お忙しいところ、お時間割いて頂いてありがとうございました m(_ _)m

投稿日時 - 2019-02-08 12:24:08

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)