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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

1回答

1394閲覧

perlスクリプトについて

Reiku

総合スコア40

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2015/11/10 09:16

編集2015/11/11 06:52

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

■ COMMON.pm

perl

1## COMMON.pm 2 3use CGI 4 5sub useCGI{ 6 my($self) = @_; 7 8 return($self->{'query'},$self->{'form'}) 9}

■ contents.cgi

perl

1# content.cgi 2 3use COMMON.pm 4 5$common = new COMMON; 6($query,$form) = $common->useCGI; 7 8&init(); 9 10sub init{ 11 print "パラメーターが不正です。" unless($query->{'uid'}[0] =~ /\w_\w/); 12}

■ 動作について
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

perl

1# COMMON.pm 2 3use CGI; 4 5sub useCGI{ 6 my $query; 7 if($ENV{'REQUEST_METHOD'} eq 'POST' and $ENV{'CONTENT_TYPE'}!~ /^multipart\/form-data/){ 8 my $form_data; 9 read(STDIN,$form_data,$ENV{'CONTENT_LENGTH'}); 10 $query=new CGI($form_data); 11 }else{ 12 $query=new CGI; 13 } 14 return($query,$form); 15} 16

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

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

すみません、わからないことだらけで申し訳ないのですが、
よろしくお願いします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

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行で書けるのが特徴です。

lang

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

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

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

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

投稿2015/11/10 10:04

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Reiku

2015/11/10 10:54

いつもわかりやすい説明ありがとうございます! よくわかりました。 ちなみに、今回の例(http://foo.var.com/contents.cgi?uid=tarou_yamada)の場合、$queryと$formには、具体的にどのような値が入っているのでしょうか?
argius

2015/11/10 12:29

Common.pmは、ここに書かれているので全部でしょうか? 書いてあるコードだけだと、$queryと$formどちらも空になりそうです。
Reiku

2015/11/11 03:04

COMMON.omについては、他にも記述はありますが、今回の件に直接的に関わってくるのはこの部分だけなはずです。 そうなんですね! $query->{'uid'}[0]にはtarou_yamadaという値が入っているかと思ったのですが、これは私の間違いなのでしょうか。。? かなり初歩的なことを聞いてしまっているかもしれませんが、
argius

2015/11/11 03:13 編集

CGI.pmをそのまま使う場合は、$cgi->param('uid');のようにするので、 このCOMMON.pmでは、+アルファの処理をして$queryに移し替えたりしているのかなと思いました。 なので書いてあるコードだけだと実際にどうなるかは推測になりますが、おそらく、$query->{'uid'}に"tarou_yamada"が入るのだと思います。$formはPOSTパラメーターかな?
Reiku

2015/11/11 05:53

すみません、完全に自分の勘違いでした。 たしかにこれでは両方共空になりますね! お手数おかけ致しました。いつもありがとうございます!
Reiku

2015/11/11 06:54

すみません、一度ベストアンサーさせていただいたのですが、 useCGIの間違いに気づいたので、一度外させて頂きました。。 質問を更新してますので、もしよろしければ、お願いできますでしょうか。。
argius

2015/11/11 07:12

new COMMONしているので、COMMONにはsub new もあると思います。そこでは何をしているか知りたいです。 また、useCGIの方ですが、$formはreturn($query,$form)にしか出てきませんが、$form_dataの間違いではないですか? そもそも、これは動作するコードなのでしょうか?
Reiku

2015/11/12 12:13

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

2015/11/12 12:16

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問