perlの$_

下記のread_stdio_x.plとread_stdio_d.plは同じ動作をします。最初のプログラムでは変数xを使っていますが、これを省略することができます。省略した場合は、「x」の代わりに「$_」という変数が使われます。

$ cat read_stdio_x.pl 
#!/usr/bin/perl
while ($x = <STDIN>) {
  print $x;
}
$ cat read_stdio_d.pl 
#!/usr/bin/perl
while (<STDIN>) {
  print;
}

$ chmod 755 read_stdio_*.pl 
$ ./read_stdio_x.pl
abc
abc
^C
$ ./read_stdio_d.pl 
def
def
^C

プログラムを停止するには、キーボードで[Ctrl]と[C]を同時に押します(画面上の^Cは、その意味です)。

標準入力からの読み込み

標準入力からの読み込みには、「<STDIN>」を使います。下記の例では、標準入力から1行読み、変数 $x に代入してから、その値をprintするプログラムを作成しています。実際に実行しているところでは、read_stdio.pl をコマンドとして実行してから、「123」をキーボードから入力すると、その入力した文字列「123」が画面に出力されます。

$ cat read_stdio.pl 
#!/usr/bin/perl
$x = <STDIN>;         # 標準入力から1行読み、変数 $x に代入
print $x;        # $x をプリント

$ chmod 755 read_stdio.pl 
$ ./read_stdio.pl 
123
123

こんにちは perl

日本語を使うプログラムでは、使用している文字コードについて意識が必要です。iconvなどで変換しましょう。下記の例では、Shift_JISのhello_ja_SJIS.plからUTF-8のhello_ja_UTF8.plへ変換しています。最初は表示のために実行しているコマンドで、次に、表示された結果を hello_ja_UTF8.plへリダイレクトしています。最後に、hello_ja_UTF8.pl を実行しています。

$ iconv -f Shift_JIS -t UTF-8 hello_ja_SJIS.pl
#!/usr/bin/perl
print "こんにちは Perl\n"

$ iconv -f Shift_JIS -t UTF-8 hello_ja_SJIS.pl > hello_ja_UTF8.pl
$ chmod 755 hello_ja_UTF8.pl
$ ./hello_ja_UTF8.pl
こんにちは Perl

perl hello.pl

which コマンドで、どこにファイルがあるか確認をしておきます。次に、hello.plを作成します。perlコマンドの場所により、先頭行の内容は変えます。実行するには、perlコマンドでファイルを指定します。hello.plをchmodで実行可能とすれば、そのままファイルを実行することができます。

$ which perl
/usr/bin/perl

$ cat hello.pl 
#!/usr/bin/perl
print "Hello, Perl\n"

$ perl hello.pl 
Hello, Perl

$ chmod 755 hello.pl 
$ ./hello.pl 
Hello, Perl

CPAN

CPANは確かに便利だ。でもはまるときは、はまる。

どうやら、CPANでモジュールをアンインストールするには、下記でいいらしい。

$ perl -MCPAN -e shell
cpan> look モジュール名
cpan> quit
$ perl Makefile.PL
$ make uninstall

ちなみに、コマンドラインで cpan というのも用意されているので、インストールはCPANのシェルに入らなくてもできる。

$ cpan モジュール名

すぐに忘れるのでメモ。

replaceAll.pl

文字列置換をするPerlプログラムを作るには、まず最初に標準入力をそのまま出力するプログラムからはじめればいい。

#!/usr/bin/perl
while(<STDIN>) {
  print;
}

置換をするためには、次のように指定を print; の前に挿入すればいい。こうすると読み込んだ文字列に対して、置換処理をしてくれる。

s/$ARGV[0]/$ARGV[1]/go;

このあたり、スクリプト言語というかPerlに慣れていないと、違和感があります。置換対象の文字列を明示的に指定しなくてもいい、というのがなんとも不思議です。

できあがったプログラムは replaceAll.pl という名前で保存したとすると、下記のように使います。

$ replaceAll.pl 検索文字列 置換文字列 < 対象ファイル

ちょっとしたツールは、シェルスクリプトでけっこう頑張っているのですが、Perlでもいいかなぁ、と最近思いつつ、最終的にはJavaで実装しておいたほうが何かといいんだよなぁ、とも思っています。開発環境的にはJavaの方が充実していますし、オブジェクト指向プログラミングもしやすいので。ただ、問題なのは、ちょっとしたツールにオブジェクト指向が必要なのか、みたいなところでしょうか。再利用性はほとんど考慮する必要がないので、ベタに手続き型で書いてしまった方がよっぽど速くプログラムが完成してしまうという気がしています。まぁ、ぼちぼちやりますけど。