• ベストアンサー

perl 矢印演算子 -> の使い方

-> という矢印演算子が勉強しているスクリプト中に出てきて書籍などで調べたのですが、 よく分かりませんでした。 連想配列で便利な面がある?のでしょうか? 何かを省略できる書き方ということでしょうか。 my $cgi=CGI->new; if($anct>$articleperpage){ if($cgi -> param('offset')){ $offset=$cgi->param('offset'); という具合にまだまだ続きますが、 矢印演算子が使われています。 アドバイス宜しくお願い致します。

  • shevy
  • お礼率67% (703/1046)
  • CGI
  • 回答数1
  • ありがとう数6

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

  • ベストアンサー
  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.1

こんばんは、shevy さん。いつぞやは混乱させてしまったみたいで、ごめんなさい。 ハッシュ(連想配列)の解説はもっと丁寧に正確に行うべきでした。m(__)m さて、この矢印は Perl5 で導入された「オブジェクト指向」機能を使って オブジェクトとメソッドを関連づける表記です。 >my $cgi=CGI->new; new というメソッドで CGI クラスのオブジェクト(インスタンス)を 生成して局所変数 $cgi に格納します。 この new のことはコンストラクタ(オブジェクトを構築するものの意)といいます。 >$cgi->param('offset'); $cgi に格納されたオブジェクトに対して param メソッドで 'offset' パラメータの値を取り出します。 こう書くと難しく感じるでしょうが、オブジェクトは自分自身いろいろな属性を持っていて、 ただの変数よりずっとお利口さんなのです。オブジェクトは自分のやるべきことを 知っていて、メソッドという「メッセージ」を受け取ることで そのメッセージに応じた振る舞いをすることができます。 さっきの「$cgi->param('offset')」で言えば、こちらが $cgi の中のオブジェクトに対して「おい、'offset' パラメータの値は何だっけ」 と呼びかけると、オブジェクトはそのメッセージに応えて値を返すということです。 詳しくは参考 URL をご覧ください。

参考URL:
http://www.pure.ne.jp/~learner/program/Perl_oo.html,http://www3.vis.ne.jp/~asaki/java/wiki/wiki.cgi?page=CGI.pm%A4%F2%BB
shevy
質問者

お礼

nightowlさん、ご丁寧にありがとうございます。 いえいえ、こうしてcgiカテゴリーに 何度も質問してお助けいただいている、 私の名前まで覚えていただきまして、 こちらが恐縮してしまいます(^^;;; 本当に感謝しております。 ご回答の件ですが、 なるほど、オブジェクト指向の記述だったんですね。 早速、ご紹介のURLをじっくりと読み解こうと思います。 ただ、まだPerlでオブジェクト指向と聞くと、 想像ができないだけに、いまから楽しみです。 Perl5からそういえば、オブジェクト指向が導入されたような記述を書籍で観たことがありました。 もっとがんばってPerlの腕を磨きます。 本当にご丁寧にありがとうございました。

関連するQ&A

  • perl初心者なのですが

    use strict; use CGI; use DBI; my $dbh = DBI->connect("dbi:ODBC:DB_test"); my $NAME1 = CGI->new(); my $ADDRESS1 = CGI->new(); my $LETTER_NUM1 = CGI->new(); my $TEL_NUM1 = CGI->new(); my $NAME = $NAME1->param('name'); my $ADDRESS = $ADDRESS1->param('address'); my $LETTER_NUM = $LETTER_NUM1->param('letter_num'); my $TELL_NUM = $TEL_NUM1->param('tell_num'); my $sth = $dbh->prepare("INSERT INTO table1(name1,address1,letter_num1,tell_num1) values(?,?,?,?)"); $sth->execute($NAME,$ADDRESS,$LETTER_NUM,$TELL_NUM); $sth->finish; $dbh->disconnect; フォームから受け取ったデータをデータベースに格納したいのですが、うまくいきません。誰か教えてください。

  • perlにおけるセッションIDについて

    sessionIDがページを更新するたびに変わってしまいます。 その結果、前回セッションに保存した値を読み込めません。 my $cgi = new CGI; CGI::Session->name("SESSION_ID"); my $session = new CGI::Session("driver:File", $cgi, {Directory=>'./session'}); print $session->header(-charset=>'UTF-8'); print $session->id(); print $session->param("name"); #表示されず。 というようにしてセッションIDを表示すると、毎回変化します。 どうしたらIDを変わらないように出来るでしょうか? ちなみに、セッションに書き込むのは、 my $cgi = new CGI; CGI::Session->name("SESSION_ID"); my $session = new CGI::Session("driver:File", $cgi, {Directory=>'./session'}); $session->header(-charset=>'UTF-8'); $session->param("name", "abc"); $session->flush(); undef($session); こんな処理をしてます。

    • ベストアンサー
    • Perl
  • 配列の要素を区切る場合

    よろしくお願いいたします。 フォームのチェックボックスのデータをCGIで受け取るのですが 確認画面で配列の要素を記号で区切りたいのですがどのように記述していいものか・・・ ご教授いただければ幸いです。 問い合わせフォーム---------------------------------------------- my $cgi = CGI->new(); my @sss = $cgi->param('sss'); ///////////省略 # チェック sub Check { $NASHI = ''; if (@sss){ }else{ $NASHI .= "<li>チェックしてください。</li>\n"; } if ($NASHI ne '') { &Error; } } # 確認 sub ConfirmHTML { &Header; print <<_HTML_; <ul><li>@sss</li></ul> _HTML_ exit; } ///////////省略 確認画面部分に @sss だけを書いてしまうと あああ いいい ううう とチェックボックスの値が一応スペースは開いていますが あああ---いいい---ううう といった記号で表示さすことはかのうでしょうか? アドバイスいただければ幸いです。 よろしくおねがいいたします。

    • ベストアンサー
    • CGI
  • Perl BBS掲示板 サーバ側のファイル削除

    いつもお世話になっております。 サーバ側のファイルを削除したいのですが、 どのようにすればいいのでしょうか・・・? #-----------------------------------------DELETE sub deletedata { use CGI; my $form = new CGI; my $tm = time; my $DELETE = $form->param('pass'); my $NO = $form->param('no'); my $NAME = TransFormdata($form->param('name')); my $TITLE = TransFormdata($form->param('title')); my $TEXT = TransFormdata($form->param('text')); my $img = TransFormdata($form->param('img')); open(FILE, "<$FILE") or die("error :$!"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; my $DELETE = $form->param('pass'); my $NO = $form->param('no'); if(length $NO == 0) {} elsif($DELETE eq $PASSWORD) { deleteImg($NO); splice @DATA, $NO, 1; } else{} open(FILE, ">$FILE") or die("error :$!"); eval{ flock(FILE, 2) }; print FILE @DATA; close FILE; &endform } #-----------------------------------------DELETE #-----------------------------------------UPFILEDELETE sub deleteImg { my ($NO,$tm,$NAME,$TITLE,$TEXT,$imgname) = split(/,/, $DATA[$_[0]]); $filename = $DIR . $imgname; if(-e $imgname) { unlink $filename; } } #-----------------------------------------UPFILEDELETE ラジオボタン選択 ↓ パスワード入力 ↓ 削除ボタン ↓ 削除 この段階で テキストファイルの指定行は削除されているのですが、 画像が投稿され、サーバー側に残っているファイルも削除させたいのです。 Unlinkを使うとなっていたのですが・・・わからないです。 どうかご教示お願い致しますm(;;)m

    • ベストアンサー
    • Perl
  • フォームのアクションから引数をとる

    <form action="test.cgi?ref=5" method="post"> このような感じで、引数を送ります。 my $cgi = CGI::new(); my $ref = $cgi->param('ref'); if ($ref eq 0){ (省略) }elsif ($ref eq 5){ こんな感じでプログラムを書きました。 アドレスを見ても、ちゃんとref=5となっていますし、 普通に<a href="test.cgi?ref=1">などのリンクから飛べば、指定したifの処理に入ります。 しかし、 <form action="test.cgi?ref=5" method="post"> 上のフォームのsubmitから送ると、ref=5のifが判別されません。 どうすれば、判別してくれるのでしょうか? ご存知の方がいらっしゃいましたら、ご教授ください

    • ベストアンサー
    • CGI
  • Perl BBS 掲示板 改行処理

    改行処理について教えてください。 今まで書き込み処理で unshift @DATA, "$tm,$FORM{'name'},$FORM{'title'},$FORM{'text'}\n"; としていたのですが、これを use CGI; my $form = new CGI; my $NAME = $form->param('name'); my $TITLE = $form->param('title'); my $TEXT = $form->param('text'); unshift(@DATA,"$tm,$NAME,$TITLE,$TEXT\n"); に変更しました。 すると sub loadFormdata が聞かなくなり、 改行処理他が対応しなくなってしまいました、 この場合、 loadFormdataの部分のどこを変えればよいでしょうか? |------書き込み処理------| sub printdata{ use CGI; my $form = new CGI; &loadFormdata(); open(FILE, "<$FILE"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; my $tm = time; my $NAME = $form->param('name'); my $TITLE = $form->param('title'); my $TEXT = $form->param('text'); unshift(@DATA,"$tm,$NAME,$TITLE,$TEXT\n"); while(@DATA > $MAX) { pop @DATA; } open(FILE, ">$FILE") or die("error :$!"); eval{ flock(FILE, 2) }; print FILE @DATA; close FILE; } |------改行処理他------| sub loadFormdata { my ($query, $pair); if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } foreach $pair (split(/&/, $query)) { my $key = ("$NAME,$TITLE,$TEXT"); my ($key, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $value =~ s/&/&amp;/g; $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\x0D\x0A\s*/<br>/g; $value =~ s/\s+/ /; $FORM{$key} = $value; } }

    • ベストアンサー
    • 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
  • 論理演算子について

    論理演算に使う「or」なんですが、制御構文ifと組み合わせて以下のような使い方をしてみました。 $data01='aaa'; $data02='あああ'; $data03='test'; if ($data01 =~ m/aaa/ or $data02 =~ m/あああ/ or &data03 =~ m/test/){ 特定の処理; } このorによる論理演算ははどこまでできるのでしょうか? 上のスクリプトは問題なく動いていますが、ちょっと不安です。 専門書を見ても、orによる論理演算は<条件1 or 条件2>としか書いてなく <条件1 or 条件2 or 条件3 or ・・・>と書いても大丈夫なのでしょうか? いくつもの比較はorを使わないほうがよろしいとは思うんですが、このorが便利なのでこれで済むなら使いたいと思います。

  • 「$| = 1;」とは何でしょうか?

    あるcgiスクリプトを見ていたら、冒頭部分に以下のようにありました。(一部省略) --------------------- use strict; use CGI; use Jcode; my $q = new CGI; $| = 1; --------------------- この「$| = 1;」とは何でしょうか?? ちなみにスカラー変数ではなさそうです。(この後出現しないので)

    • ベストアンサー
    • Perl
  • Perl Postgres 連想配列化

    いつもお世話になっております。 標題についてご教授願えないでしょうか Perl+Postgressqlで取得したレコードを連想配列化にしたいのですが、 @data = (); my $conn = Pg::connectdb(接続情報) my $query = "SELECT * FROM data; my $result = $conn->exec($query) if($result->resultStatus ne PGRES_TUPLES_OK){ exit; } my $cnt = $result->npuples my $fields = $resut->$rset->nfields; for ($i=0; $i<$cnt; $i++){ for(j=0; $j<fields; $j++){ $data[$cnt][$result->fnam($fields)] = $result->getvalue($j,$j) } これではいけないんでしょうか。