PerlとCGI

1.概要

(1)諸々

・ファイルの拡張子は .pl
・開発環境はLinuxなどが一般的であろう。
・動かすだけなら、Webのツールでもいい
https://paiza.io/ja/projects/new
・CGIは言語名称ではないので、PerlでもシェルでもC言語でもよい。

(2)LinuxでPerlだけを動かす

あまりケースは多くないと思うが、Webアプリを作るとかではなく、Linuxでperlを単純にプログラム言語として動かしてみよう。AWSで実行した。

#which perlでperlが入っているかを確認しよう。おそらく入っているはず。
which perl #==>/bin/perl

#ファイルを作成する。拡張子はなんでもいいはずだが、わかりやすく.plとする。
cat <<'EOF' > a.pl
#!/bin/perl
print "hello\n";
EOF

#実行権限の付与
chmod +x a.pl

#実行
./a.pl
(3)インストールと設定

CGIを有効にするには次の2つがある。
❶OptionsディレクティブにExecCGIを有効化
・拡張子はcgiにする。
→厳密にはAddHandlerで指定する。
# AddHandler cgi-script .cgiのコメントアウトは消す
また、plという拡張子でもCGIを有効にするには
AddHandler cgi-script .cgi .pl

<Directory "/var/www/html">
 Options Indexes FollowSymLinks ExecCGI

※サブディレクトリでCGIを実行する場合、サブディレクトリごとに設定が必要(だと思う)

❷ScriptAliasディレクティブにCGIプログラムを格納するディレクトリを指定。
この場合、拡張子は何でも良い。
ScriptAlias /cgi-bin/ "/var/www/html"


Options ExecCGI

❸実際に実行するのは以下のような感じ(AWS)

#http インストール
yum -y install httpd

#perl-CGI インストール
yum -y install perl-CGI

#httpd.confの以下を変更
vi /etc/httpd/conf/httpd.conf

# 以下を修正
#   Options Indexes FollowSymLinks
#  ==>  
#   Options Indexes ExecCGI FollowSymLinks
#
#   #AddHandler cgi-script .cgi
#  ==>  
#   AddHandler cgi-script .cgi

#Apache 起動関連
systemctl start httpd
systemctl enable httpd

cd /var/www/html/

#CGIのファイル(たとえばfile.cgi)を作成

#実行権限を付与
chmod +x file.cgi
(4)コメント

#を使う

(5)おまじない

❶PATH
1行目にパスを書くが、パスは以下の方法で確認する。AWSはデフォルトが以下だった。

# which perl
/bin/perl

または、以下かも
/usr/bin/perl

→作成するファイルの1行目には、以下のようにパスを加える。

#!/bin/perl
print "hello\n";

❷文法チェック
冒頭に以下を入れておこう。文法のチェックをしてくれ、警告を出してくれる。

use strict;
use warnings;

2.書いてみよう

❶表示

print("hello"); #==> hello

または

print "hello";

❷改行コード
\n 
タブは \t
❸シングルクォートとダブルクォーテーション
書き方は、以下のように"でくくる

print "hello\n";

変数があっても、ダブルクォーテーションなら変数展開して表示される。

my $a='Taro';
print "My name is $a."; # ==> My name is Taro.

そのままの文字として表示させたければ'(シングルクォートで囲う)

print 'hello\n';

3.変数

・スカラ変数(数字や文字列)、配列変数、ハッシュ変数の3種類がある。
・スカラ変数は$、配列変数は@、ハッシュ変数は%を使う。

(1)スカラ変数

もっとも一般的な変数で、数字や文字を入れる
❶宣言
myを付けて変数の前に$をつける。

my $abc;
$abc = "Hey";

または

my $abc = "Hey";

❷文字や数字を入れる

my $abc = "Hey";
print $abc; # ==> Hey
my $x = 10;
my $y = 20.3;
print $x; # ==> 10

❸演算

print $x; #==>10
print $x * $x; #==>100
print($x * $y);  #==>203

その他、他のプログラムでよく使う以下も記載できる。
たとえば、++ ** -- +=  +-
❹文字列の演算
2つの文字を接続したい場合は「.」でつなぐ。

my $a='Taro';
print "My name is $a" . "-kun"; # ==> My name is Taro-kun.
(2)配列変数

配列変数を使う場合は@を使う
❶宣言と表示
myを付けて変数の前に@をつける。

my @a = (10, 20, 30);
my @b = (1..10,);
my @c = ('Tokyo', 'Osaka', 'Nagoya');
print @a; #==> 102030
print @b; #==> 12345678910
print @c; #==> TokyoOsakaNagoya

❷配列の要素を表示
よくあるやり方。配列の1つ目を取り出すには、数字の0を指定し、なおかつ、スカラー変数の$をつける。ちなみに、@でも表示はできた。

my @a = (10, 20, 30);
print $a[0]; #==> 10
print @a[0]; #==> 10

末尾を取り出すには、添え字を-1にする。

print $a[-1]; #==> 30

❸ハッシュ変数
Pythonの辞書型と思えばいいだろう。例はこんな感じ。

my %c = ("Tokyo"=>10, "Osaka"=>20, "Nagoya"=>30);
print $c{"Tokyo"}; #==> 10

4.条件分岐

if文を使って条件分岐をする。

(1)簡単な例

簡単な条件分岐をやってみる。
❶年齢が20歳以下なら表示

my $age = 20;
if ($age <= 25) {
    print("You can entry");
}

別の書き方もある。1行で書けるので、すっきり。

my $age = 25;
print("You can entry") if ($age <= 25);

❷2つの条件を組み合わせ

my $age = 20;
my $city = "Osaka";

if (($city eq "Osaka") && ($age <= 25)) {
    print("You can entry");
} else {
    print("You can't");
}

ちなみに、pythonと違って、print文のインデントはなくても動いた。
❸3つ以上の条件
elseifを使えばいい。

(2)比較演算子

❶文字列の比較演算子
文字列の比較の場合の記号は、数字の比較の><==などではなく、以下を使う。

演算子 意味
eq equal 同じ
ne not equal 異なる
gt grater than 大きい
lt less than 小さい

❷数字の比較演算子

演算子 意味
== 同じ
!= 異なる
> より大きい
>= 以上
(3)論理演算子
演算子 意味
&& AND andでも可能
|| OR orでも可能
! NOT notでも可能

5.CGIで利用する

(1)はじめに

CGI.pm を使うと便利なので、はじめに呼び出す。$cgiに深い意味はなく、別の名前でもなんでもいい。

use CGI;
my $cgi = new CGI;

パラメータを変数に格納する場合は、以下が例。

my $url =$cgi->param('url');

$cgiというのは、先に定義した$cgi
ここでは、urlにセットされた値を、このperlプログラムのスカラー変数$urlに入れている。

6.ループ処理

for またはwhileで回す
❶forの場合
0~2までを表示する。

for (my $k = 0; $k <3; $k++) {
    print "k=$k\n";    
}

出力結果は以下

k=0
k=1
k=2

❷whileの場合

my $k = 0;
while ($k < 3) {
    print "k=$k\n";
    $k++;
}

7.ファイル処理

いくつかやり方があるようだ。

(1)ファイルをオープンして読み込む

単純な例で紹介する。まず、以下のファイル(file.txt)があるとする。

1:Tokyo
2:Nagoya
3:Osaka

Perlでファイルを開き、1行目と2行目を表示する。まあ、本来はループ処理をさせることであろう。

open (IN,"file.txt");
@abc=<IN>; #@で配列に入れる
close (IN);

print $abc[0];
print $abc[1];

ここで、IN という文字を使っているが、xxxなどの違う文字でもいい。

(2)ファイルに書き込む

・上書き
open (IN,">file.txt");
・追記
open (IN,">>file.txt");