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");