Perl を使おう! 第2回


[ 目次 / 前頁 / 次頁 ]

前回の宿題に関連して

- print 命令で CGI, SSI プログラムを作る -
回答例 by yama

perlでは、コマンドの実行結果を得る場合には、コマンドをバッククォートで囲めばよい。 これを使うと、print 命令だけでもunixコマンドを利用すればかなりのことができます。 例えば、print `date`; では現在時刻が標準出力に出力されます。 また、現在の環境を知るためのコマンドは env ですから、これらを表示する CGI プログラムを作ってみましょう。

例)env.cgi

    === begin [env.cgi] ===
    #!/usr/bin/perl
    print "Content-type: text/html\n\n";
    print "<title> Print ENV  </title>";
    print "<H3>CGI program - print env- </H3>\n";
    print `date`;
    print "\n";
    print `env`;
このままでは、うまく表示されなかったですね。そうです、HTMLではソースの改行は改行にはならないのです。さて、どうすれば... HTML でなくせばいいですね。

例)env1.cgi

    === begin [env1.cgi] ===
    #!/usr/bin/perl
    print "Content-type: text/plain\n\n";
    print "CGI program - print env-";
    print `date`;
    print "\n";
    print `env`;
でも、やっぱりHTML文書にしたいですね。そのような場合には PRE タグを利用しましょう。

例)env2.cgi

    === begin [env2.cgi] ===
    #!/usr/bin/perl
    print "Content-type: text/html\n\n";
    print "<title> Print ENV  </title>";
    print "<H3>CGI program - print env- </H3>";
    print `date`;
    print "\n<PRE>\n"
    print `env`;
    print "\n<PRE>\n";

そろそろ、print以外についても、Perlの文法について取り掛かりましょう。

Perl 言語

  1. プログラムは文の並びであり、1つの文の最後には C 同様に;をつけます。

  2. 注釈

    # から改行までは注釈となります。

  3. 名前

    変数名、関数名は英字から始まり、英数字とアンダースコアが使用できます。 大文字小文字は区別されます。

  4. スカラーデータ

    Perlにおいてスカラーデータとは、数値や文字列のことです。 Perlでは、数値も文字列も同様に扱い、数値に厳密な型はありません。
    数値
    Perlの内部では、数値は全て倍精度浮動小数点数である。 ただし、数値のリテラルとして、浮動小数は2.5, 1.4e2, -2.4e-12, 12, 0377, 0xff などが有効であり、整数として 5, 15, -3 が有効である。 ただし、先頭に 0 を付けた場合には8進数、先頭が 0x で始まるものは16進数として扱われます。
    数値の演算子としては、数値演算子(+,-,*,/,**,%)、数値比較演算子(<,<=,==,>=,>,!=)があり、代入は=が用いられます。

    文字列
    文字列に関しては、シングルクォート文字列とダブルクォート文字列があります。 シングルクォートで囲まれた文字列はそのままのものが内容となり、シングルクォートそのものを入れる場合にはシングルクォートの前にバックスラッシュを置きます。 ダブルクォートで囲まれた文字列は、変数展開が行なわれます。 (エスケープ文字の展開、\n は改行に、\t はタブに等が行なわれ、また値が代入されている変数の値の展開が行なわれます。)
    文字列演算子としては、.(ドット)が文字列の結合をxが文字列の繰り返し、比較演算として(eq, ne, lt, gt, le, ge)です。

    スカラー変数
    スカラー変数は変数名の先頭に$をつけて表します。 基本的な代入、演算に加え代入は値としても利用可能です。二項代入演算子、インクリメント、デクリメントがあります。Perlでは浮動小数に対するインクリメント、デクリメントが可能です。
    $a = 4;
    $b = ($c=3)+$a;
    $a += 1.5;
    $c = $a++;
    chop()演算子は、文字列の最後の1文字を取り除きます。<STDIN>により標準入力から値を受け取ります。
    $a = <STDIN>;
    chop($a);
    or
    chop($a = <STDIN>);
  5. 配列とリストデータ

    配列はスカラーデータに順序を付けて並べたものです。 配列の各要素はスカラーです。 配列のリテラルは、(1,3,4) のように値をカンマで区切りカッコで囲む、または、リスト構成演算子を利用して (2..7,10) のようにすることもできます。

    配列変数は、先頭に @ を付けて表します。Perlでは、異なる型のオブジェクトに異なる名前空間を用意しています。 配列変数をスカラー変数に代入すると、配列の長さがセットされます。配列の要素は、配列名の先頭に$を付け[]の中に添字番号を指定することにより表現されます。 ($hairetsu[0],$hairetsu[1])は@hairetsu[0,1]で表すことができます。

    配列データに演算子としてpop(),push()はそれぞれ、スカラーや配列を配列の右側から削除、追加するものであり、shift(),unshift()は左側から削除、追加します。reverse() はリストの順番を逆転させ、sort()は文字列としてソートします。chop()は全要素に作用します。split(/ /,$a)により$aの空白区切りのものがリストデータになります。

    @a = (2, 5 ,6);
    $b = shift(@a); <-- @a は (5,6) , $b は 2
    $c = "abc df fg";
    @d = split(/ /,$c); <-- @d は ("abc","df","fg")

  6. ファイルの入出力(簡単に)

    ファイルからの読みだし、ファイルへの書き込みは、open() 演算子により行なわれます。 読み出しの場合は、ファイル名に、ファイルハンドル名を対応させます。

    open(FILE,"filename");
    $a = <FILE>
    これで、$a はfilenameの内容です。 書き出しの場合、ファイル名の前に >を付れば新規書き込みで、>> を付けると、追加書き込みになります。
    open(FILE,">filename");
    print FILE $a
    これで、$a の内容がfilenameに書き込まれます。 オープンしたファイルはclose()演算子により閉じます。
    close(FILE);

アクセスカウンター

さて、これだけ理解するとホームページにも変化をつけたくなるのも人情です。 では、アクセスカウンターを作りましょう。 とはいっても、まだ準備は不十分なのでとりあえずのものを作ってみましょう。
アクセスカウンターとは
あなたは 人目の訪問者です。
というやつです。 これも、SSIを使えば簡単にできます。 上は実際には次のように書かれています。
  あなたは <!--#exec cmd="./count.pl" -->人目の訪問者です。
このプログラム(count.pl)は、実行されるとカウンターファイル(.num)の値を一つ増やすプログラムです。 そうです、カウンターファイルを作って、そこに値を入れておき、プログラムが実行されたら値を+1してその結果を表示するプログラムを書けばいいだけですね。 書いてみましょう。一例をあげると
  === begin [count.pl]=== 
  #!/usr/bin/perl

  open(FILE, ".num");
    $num = <FILE>;
  close(FILE);
  $num++;
  open(FILE, ">.num");
    print FILE $num;
  close(FILE);
  print "$num\n";
これで、count.plを実行するたびに+1された値をファイルに書き込み、その値を表示するプログラムが出来上がりました。 実際に実行してみましょう。
そうです! 準備不足でした。 カウンターを実行可能にする為には、カウンターのファイルを作ってやる必要があります。 (0の数字が入っているファイル) 次の作業が必要です。
  1. count.pl を実行可能にする。
    # chmod 755 count.pl
  2. カウンタファイル(.num)を作成し書き込み可にする。
    # echo 0 > .num
    # chmod 666 .num
  3. これで、実行して 1 が返されれば準備完了!(ページに記入します。)
    # count.pl
    1
できたら、ホームページに取り込みます。


今日の宿題!

自分のホームページにカウンターを入れ、perl でdateコマンドの結果を整形し year month date (week) time の形で表示しましょう。 例)
あなたは、15人目の訪問者です。
現在時刻 1996 Nov 15 (Feb) 15:00:00
こんな風にページに入れてみましょう。
[ 目次 / 前頁 / 次頁 ]
最終更新時刻
by Yoshiro Yamamoto