• ベストアンサー
  • 困ってます

Perl の use strict に付いて

  • 質問No.9584539
  • 閲覧数121
  • ありがとう数2
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 58% (31/53)

●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); 」
をどう書き換えれば、二つとも記述したまま正常に動くのでしょうか?
よろしくお願いします。

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

  • 回答No.1
  • ベストアンサー

ベストアンサー率 66% (389/586)

${$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;

にされては如何でしょう。
お礼コメント
nobu003

お礼率 58% (31/53)

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

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

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

お忙しいところ、お時間割いて頂いてありがとうございました m(_ _)m
投稿日時:2019/02/08 12:24
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ