perlを使いこなす(1)
perlは、もちろんCGIを書くための重要な言語でもありますが、UNIXのコマンドラインはインタラクティブに働くため、相互の会話形式を取りながら使用することが出来ます。
コマンドラインでperlを使う
コマンドラインにログイン(rootでなくとも可)して、プロンプト(#,$などの記号)のところで"perl"とタイプします。ここでシェルは次の指令を入力待ちになりますので、perlで命令を打ち込みます。
このperlというコマンドをタイプした後は、その気になれば何万行でもプログラムを入力することが出来ます。
以下に、いくつか例をあげて見ます。
# perl print "Hello! World!\n";入力が終了したら、^d(=[Ctrl]+[d])をタイプします。この^dはEOF、つまりファイルの終わり(End Of File)を意味する特殊文字で、これが入力されるとシェルは命令を処理し、結果をSTDOUTに返します。
# perl print "Hello! World!\n"; ^d Hello! World! #書き方はCGIと同じですが、サーバーもブラウザも介さないので、read関数によるデコードやContent-typeなどの指定は必要ありません。
このperlというコマンドをタイプした後は、その気になれば何万行でもプログラムを入力することが出来ます。
以下に、いくつか例をあげて見ます。
変数を使った計算
$ perl $a = 1; $b = 2; $c = $a + $b; print "$c\n"; ^d 3 $
配列の内容を表示
$ perl
@_ = ('1','2','3','4','5');
foreach(@_) {
print "$_\n";
}
^d
1
2
3
4
5
$
配列を使った計算
$ perl
@_ = ('1','2','3','4','5');
foreach(@_) {
$a = $_ + 1;
print "$a\n";
}
^d
2
3
4
5
6
$
処理結果をファイルに書き込む
$ perl
@_ = ('1','2','3','4','5');
open(IN, "> ./hoge.dat");
foreach(@_) {
$a = $_ + 1;
print IN "$a\s";
}
print "\n";
^d
$
*hoge.datに"2 3 4 5 6"と記録されている。プログラムファイルのコマンド化
CGIの先頭行に書く"#! /usr/local/bin/perl"は、"#!"によってコマンド化されて、以下のプログラムを実行しなさいという命令です。
これを利用すると、コマンドラインで直接プログラムを打つ代わりに、エディタを開いてプログラムを保存し、コマンドラインから実行することが出来ます。
これを"lowercase"という名前で保存します。aaa.htmlというファイルのタグを小文字に書き換えましょう。
コマンドラインに戻り、
bbb.htmlを開けて見ましょう。<HTML>が<html>に書き換っていますね?
成功なら、bbb.htmlをaaa.htmlにmvします。
これを利用すると、コマンドラインで直接プログラムを打つ代わりに、エディタを開いてプログラムを保存し、コマンドラインから実行することが出来ます。
#! /usr/local/bin/perl
# lowercase
@_ = <STDIN>;
foreach(@_) {
if(/\<(.+?)\>/) {
tr/A-Z/a-z/;
print;
} else {
print;
}
}
print "\n";
exit(0);
これは、ファイルのタグ記述を大文字から小文字に置換するプログラムです。実は不完全なのですが、例題ということでご容赦を。これを"lowercase"という名前で保存します。aaa.htmlというファイルのタグを小文字に書き換えましょう。
コマンドラインに戻り、
$ lowercase < aaa.html > bbb.htmlとタイプしてEnterします。この場合は^dは必要ありません。何故なら、which perlやls -lと同じ扱いのコマンドだからです。
bbb.htmlを開けて見ましょう。<HTML>が<html>に書き換っていますね?
成功なら、bbb.htmlをaaa.htmlにmvします。
フィルター
この"lowercase"のように、ファイルの中身に何らかの加工を加えて出力するプログラムを「フィルター」と呼びます。正規表現を駆使して、オリジナルのフィルターをどんどん作成して下さい。
フィルターの一例
#! /usr/local/bin/perl
# numcat
$i = 1;
while(<STDIN>) {
print "$i: ";
print;
$i++;
}
$ numcat < hoge.txt で、hoge.txtの各行が番号付で表示されます。
#! /usr/local/bin/perl
# rmtag
while(<STDIN>) {
s/<.*?>//g;
print;
}
タグを削除し、プレーンテキストにして表示します。
#! /usr/local/bin/perl
# encode
require './jcode.pl';
while($data = <STDIN>) {
&jcode'convert(*data,'sjis');
print $data;
}
print "\n";
exit(0);
同じディレクトリにjcode.plを置いて実行すると、ファイルの文字コードをsjisに変換します。フィルターの一般化
これらのフィルターは、このままでは処理しようとするファイルと同じディレクトリに置いて使うか、もしくは使う度にフィルターまでのフルパスを入力しなければなりません。
これをcatやlsなどのコマンドのように一般化し、どこからでも使用できるようにするには、環境変数PATHを設定します。
ホームディレクトリ以下のどこかにフィルター専用ディレクトリを作成し、ファイルを集めておきます。
~/.bashrcを開けて、PATHに専用ディレクトリまでのフルパスを書き加えて保存し、シェルを再起動します。
/usr/home/bin/lowercaseと返して来れば成功です。
これをcatやlsなどのコマンドのように一般化し、どこからでも使用できるようにするには、環境変数PATHを設定します。
ホームディレクトリ以下のどこかにフィルター専用ディレクトリを作成し、ファイルを集めておきます。
~/.bashrcを開けて、PATHに専用ディレクトリまでのフルパスを書き加えて保存し、シェルを再起動します。
例)PATH=/usr/home/bin例えば上記の例題コマンドならwhich lowercaseで確認します。
/usr/home/bin/lowercaseと返して来れば成功です。
[ CGI Top ]
[ BACK ]
[ Reference Top ]
[ NEXT ]
[ HOME ]