• ベストアンサー

Perlモジュールのparam()を使って

ネットでいろいろ調べていたらPerlモジュールのparamですべてのパラメーターを得る場合引数をいれずに param()とすればいいとかかれていたので、すべてのパラメーターから,カンマがあればエラーにするという構文を書こうとしましたがうまくいきません。 @params = param(); foreach $param (@params) { if($param =~ /\,/){&error('フォーム内に「,」は入力できません。');}; } 上のようにしてもスルーします。 間違っているのだと思いますが、すべてのパラメーターからマッチングさせたい場合どのようにすればいいのでしょうか? よろしくおねがいします。

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

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

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.3

CGI.pmを利用している場合、各キーに対する値は param(キーワード)で取り出せます。 なので元のスクリプトの修正は $param を利用して if(param($param) =~ /\,/){&error('フォーム内に「,」は入力できません。');} でよいかと思います。 ちょっと長いですが参考URLにCGI.pmの説明を載せています。

参考URL:
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
titikun00
質問者

お礼

@params =param(); foreach $param (@params) { if(param($param) =~ /\,/){&error('フォーム内に「,」は入力できません。');}; } としたらばっちりうまくいきました。 いわれればそうだなーと思うのですが、おもいつきませんね・・・ 助かりました。

その他の回答 (2)

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

param(); の前に全角スペースがあります。 このために全体がエラーになっているのではないでしょうか? ついでに、if(){}の後に;は必要ありません。(書いてもいいですが) foreachの部分自体は間違っていないと思いますが、 どのフィールドでエラーがあったのか表示すると良いかと思います。 どのフィールドでということをしないのであれば、 1つエラーがあれば、抜けるようにした方がいいかもしれません。

titikun00
質問者

お礼

No1の補足でも答えましたが値のほうを取得したいので当然カンマはでてきません・・・ どうすれば・・

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

param()で得られるのはパラメータのキーワードの一覧です。 クエリがabc=123&def=456だとしたら @paramsにはabcとdefが入ります。

titikun00
質問者

お礼

まったくもって勘違いしていました。 私が得たいのは123のほうです。 パラメーター値を得たい場合はどうすればいいのですか?

関連するQ&A

  • Perlのフォームパラメータの受け取り方、モジュールのコンパイルなど

    PHPではフォームのパラメータは $kosuu = $_POST['kosuu']で取得できますが、Perlでは一般的にどのように受け取るのでしょうか? PHPは理解しやすい(方法が1つ)ですがPerlはいろいろとできそうで、誰が見てもわかるor信頼性が高い記述方法が知りたいです。 また、WindowsのActivePerlを使っているのですが、CPANでモジュール?をインストールする場合は、VisualC++6のインストールが必須でしょうか? BoarlandC++5.5無料をインストールして、モジュールのコンパイルをしたいのですが可能でしょうか?

    • ベストアンサー
    • Perl
  • Powershellのparamについて

    Powershellについて質問いたします。 自分で確かめた限りですが、paramとargsは同時に使用できないのでしょうか? 使用の仕方は $args.length param($引数1,$引数2.$引数3) といった形で、paramの前にargs定義があると下記のエラーがでて 用語 'param' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。 逆にparamがargsの前にあると値が取れていないみたいです。(args.lengthの値が0) Paramでlengthのようなことができればいいのですが。

  • パッケージとモジュールについて

    こんにちは。Perlを学習し始めた初心者です。 Perl 5.87を使っており、標準モジュールを使う方法を書籍で読みました。 例えば、フォームに入力、送信されたデータを処理するために use CGI; と最初に記述して使うことができますが、 別のエラー処理の構文を見ると $CGI::POST_MAX と1行目に記述してあります。 パッケージとモジュールの概念が、よく分かっていないので戸惑って います。 C:\perl\lib にある、CGI.pmというモジュールを使用していると思う のですが、use CGI;と記述するときと $CGI::と記述するとき、何が異なるのでしょうか? 後者はCGI.pmの中にある、POST_MAX変数を使うということでしょうか? パッケージという言葉を見ても、よく分からずネットで随分調べましたが、余計に分からなくなってしまいました。 お忙しいところ申し訳ありませんが、よろしくお願い致します。

    • ベストアンサー
    • Perl
  • PerlのC++の簡単なサンプルのモジュールを作成したいのですが

    PerlのC++の簡単なサンプルのモジュールを作成したいのですが 以下で困っております。 【エラー内容】 nmake後のエラー Microsoft (R) Program Maintenance Utility Version 6.00.8168.0 Copyright (C) Microsoft Corp 1988-1998. All rights reserved. cl -c -nologo -O1 -MD -Zi -DNDEBUG -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DPERL_MSVCRT_READFIX -O1 -MD -Zi -DNDEBUG -DVERSION=\"0.01\" -DXS_VERSION=\"0.01\" -IC:\usr\lib\CORE Car.c Car.c car.hpp(4) : error C2061: 構文エラー : 識別子 'Car' がシンタックスエラーを起こしました。 car.hpp(4) : error C2059: 構文エラー : ';' car.hpp(4) : error C2449: '{' を見つけました (関数のヘッダーがないかもしれません)。 car.hpp(8) : error C2059: 構文エラー : '}' Car.c(52) : error C2065: 'XS_Car_new' : 定義されていない識別子です。 Car.c(52) : warning C4047: 'function' : 間接参照のレベルが 'void (__cdecl *)(struct interpreter *,struct cv *)' と 'int ' で異なっています。 Car.c(52) : warning C4024: 'Perl_newXS' : の型が 3 の仮引数および実引数と異なります。 NMAKE : fatal error U1077: 'cl' : リターン コード '0x2' Stop.

    • ベストアンサー
    • Perl
  • PerlのモジュールにWWW::Mechanizeについて

    PerlのモジュールにWWW::Mechanizeというものがありますが、これはリンクやフォームを制御する場合は便利ですが、HTMLのタグ(例えば、<title>この部分</title>)を抽出する場合などは、HTML::TreeBuilderを使えば良いのでしょうか? また、WWW::Mechanizeに詳しい書籍(英語でもOK)がありましたら教えてください。

    • ベストアンサー
    • Perl
  • perlの質問

    #!/usr/local/bin/perl require 'jcode.pl'; # 漢字コード変換ライブラリ #********** データを受け取る $query = $ENV{ 'QUERY_STRING' }; &parse_param( $query ); $name = $param{ 'name' }; # 投稿者 $email = $param{ 'email' }; # メールアドレス #********** 結果の出力 print "Content-type: text/html\n\n"; print "投稿者:".$name."<BR>"; print "メールアドレス:".$email; exit; #********** 入力したデータの分解 ********** sub parse_param {  local( $name, $value );  local( $parse_data ) = @_;  @in_params = split( /&/, $parse_data );  foreach $in_param ( @in_params ) {   ( $name, $value ) = split( /=/, $in_param );   $value =~ tr/+/ /;   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge;   &jcode'convert( *value, 'sjis' );   $param{ $name } = $value;  } } の $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack の部分だけ、何の処理をしているかがいまいちわかりません。 わかる方お願いします。

    • ベストアンサー
    • Perl
  • PerlやApacheで各キャリアの絵文字を自動認識するモジュールを探

    PerlやApacheで各キャリアの絵文字を自動認識するモジュールを探しています。 printするモジュールはあるみたいなのですが、formタグなどから打ち込まれた絵文字を自動認識してutf8なりsjisに変換して受け取るモジュールが分からなくて困っています。 現在考えうるのはとりあえずformで放り込まれたものをbainaryで受け取って全てマッチングさせるという方法ですが、やはりモジュールで高速したいと考えています。 そのようなモジュールや方法をご存じの方がいればURLだけでも結構なので教えていただ生きたいです。

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

    • ベストアンサー
    • Perl
  • メールフォームから自動返信される結果の文字が2回繰り返されます。

    perlでできたCGIメールフォームをカスタマイズしていますが、テストをすると、自動返信されるメールに、結果が一部、2重に表示されてしまいます。 尚、inputからパラメータを渡して、送信メールに反映できるようにしたいのです。 何度も試してみましたが、解決できませんでした。 この原因を探るにはどのあたりを疑っていけば早いでしょうか。 ざっくりでもかまいません。ヒントをいただけたら大変助かります。 全コードは難しいので、 疑わしいと思うコードと、カスタマイズの際追加した部分のコードのみ以下に掲載します。 よろしくお願いします。 ======================================================== ~ foreach my $key ($in->param) { my @list = $in->param($key); $in{$key} = join('/',@list); } ~ ======================================================== ~ my $q = new CGI; my $item_name = $q->param('item_name'); # HTMLテンプレート パラメータ $tmpl->param( 'type' => $type, 'item_name' => $item_name, 'error_count' => scalar keys %{$error_list}, ); ~ ========================================================

    • ベストアンサー
    • Perl
  • Perlでの改造方法

    とほほHPでPerlについて勉強し始めたのですが、わからない箇所があり困っております。 フォームaに「1」と記入した場合はフォームbに「2」と記入しないとエラーが起こるようにしたいのですが、どうしてもわかりません。 if ($in{'a'} =~ /1/だった場合に$in{'a'} !~/2/) {&error("エラー文字");} こんな感じにしたいのですが、どうすればいいのでしょうか。 また、Perlの勉強をするにお勧めの本などありましたら教えていただけると助かります。宜しくお願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう