質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

perlスクリプトについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 749

Reiku

score 36

当方、perl初心者です。よろしくお願いします。
現在perlの勉強中で、perlで書かれたcgiスクリプトを読んでいるのですが、
下記のスクリプトの動作?が理解できないので、ご助言頂きたいです。

■ COMMON.pm
## COMMON.pm

use CGI

sub useCGI{
    my($self) = @_;
    
    return($self->{'query'},$self->{'form'})
}

■ contents.cgi
# content.cgi

use COMMON.pm

$common = new COMMON;
($query,$form) = $common->useCGI;

&init();

sub init{
    print "パラメーターが不正です。" unless($query->{'uid'}[0] =~ /\w_\w/);
}

■ 動作について
Webからcontent.cgiを下記のようにuidという引数を持たせて呼び出しています。

http://foo.bar.com/content.cgi?uid=tarou_yamada

個人的には、引数であるuidを$queryに配列として持たせて、
その値が、_(アンダーバー)を間に挟んだ文字列でなければ、
エラーメッセージを表示刷るものだと理解しています。

☆ 質問したいこと
・ 質問1
まず。contents.cgiで

($query,$form) = $common->useCGI;

とした時に、何が起こっているのかが知りたいです。
$queryには引数?
$formには何が入っているのかわからない状態です。

・質問2
print "パラメーターが不正です。" unless($query->{'uid'}[0] =~ /\w_\w/);

この一行の処理が知りたいです。
上述したように、uidの値で判定しているのだと思っているのですが、
この認識で良いのでしょうか?

お手すきの方いらっしゃいましたら、
よろしくお願いします。

■ 2015/11/11追記
すみません、一度解決済みにしたのですが、
プログラムの間違いに気づいたので、追記します。

useCGIが違うものを見ていました。
正しくは、以下のとおりです。

■ COMMON.pm
# COMMON.pm

use CGI;

sub useCGI{
        my $query;
        if($ENV{'REQUEST_METHOD'} eq 'POST' and $ENV{'CONTENT_TYPE'}!~ /^multipart\/form-data/){
                my $form_data;
                read(STDIN,$form_data,$ENV{'CONTENT_LENGTH'});
                $query=new CGI($form_data);
        }else{
                $query=new CGI;
        }
        return($query,$form);
}

追加質問1
上記のCOMMON.pmを使った場合、
$queryにはどのような値が格納されるのでしょうか?
(http://foo.var.com/contents.php?uid=tarou_yamagaの場合)

また、
$query->{'uid'}[0]
には、どのような値が入るのでしょうか?
というか、受け取った引数を、ハッシュとして持っているということ?


すみません、わからないことだらけで申し訳ないのですが、
よろしくお願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

質問1への回答:

Perlは、関数の戻り値を複数返すことができます。

sub useCGIのおわりにreturn($self->{'query'},$self->{'form'})とあるので、$self->{'query'}$self->{'form'}を両方呼び出し側に渡していることになります。

結果として、($query,$form) = は、$queryには$self->{'query'}が、$formには$self->{'form'}が入ります。


質問2への回答:

unlessというものが少し分かりにくいですが、これはifの反対で、この書き方の場合は「右側の条件を 満たさなければ 、左の処理を行う」というものです。

以下のように書いたのと同じですが、カッコ無しで1行で書けるのが特徴です。

unless ( $query->{'uid'}[0] =~ /\w_\w/ ) {
  print "パラメーターが不正です。";
}


$query->{'uid'}[0] =~ /\w_\w/の部分は、正規表現の式です。
正規表現とは、文字列があるパターンにマッチしているかどうかを判定する機能です。

この場合、\wは任意の英数字を意味するので、tarou_yamadaという文字列に対しては、u_yの部分がパターンと合致するため、条件を満たすことになります。


2つを合わせると、「uidが、パターン/\w_\w/にマッチしていなければ、printを実行する」という意味になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/11 16:12

    new COMMONしているので、COMMONにはsub new もあると思います。そこでは何をしているか知りたいです。

    また、useCGIの方ですが、$formはreturn($query,$form)にしか出てきませんが、$form_dataの間違いではないですか?


    そもそも、これは動作するコードなのでしょうか?

    キャンセル

  • 2015/11/12 21:13

    半分くらい自己解決しました!
    いろいろありがとうございました!

    キャンセル

  • 2015/11/12 21:16

    どうなったのか心配していましたが、
    解決できたということで、安心しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる