6.0 if の分岐

条件によって処理をしたり、しなかったりするのには、if が使われる。形式は、

if ( 条件 ) { 真の場合の処理 }

である。条件としては、(1) パターンが存在すること、 (2) 2 つの数字、文字の比較または大小関係が用いられる。(1) や (2) の結果 として 真 であれば if の (条件) は 1 偽であれば 0 が与えられる。


(例題 6.0) if の分岐の例と、条件の例を示す。(p6-0.pl)
#!/usr/local/bin/perl
$a = 1; print '$a = ',$a,"\n";  # 変数 $a に 1 を代入。
# もし $a が 1 に 等しかったら (== 数値として等しい) 印刷。
if ($a == 1) { print '$a = 1',"\n"; }
# $a が 1 の判定であるならば、下の表記でも正しい
if($a) { print '$a is true',"\n"; }
# 等しくないという場合には、!= が使われる。
if ( $a != 2 ) { print '$a is not 2.',"\n";}
# 大小関係においては、> と < (等号を含まない場合)、<= と >= (含む場合)
if ( $a >= -1) { print '$a is greater or equal to -1.',"\n";}
# 次に文字列の条件。数字の場合と違うので注意。
$b = 'uec'; print '$b = ',$b,"\n"; # $b に 文字列 uec を代入。
# 等しい場合 eq、 等しくない場合 ne、
if ($b eq 'uec' ) { print '$b is equal to \'uec\'. ',"\n"} ;
if ($b ne 'uec' ) { print '$b is not uec.',"\n"} else {print 'No',"\n"}; 
# 文字列の大小 gt と lt、及び等しい場合を含む ge と le は、アルファベット
# 順で決められる。
if ("$b" lt 'ued' ) { print "$b is litter than \'ued\'.\n"; }
# 文字列の長さ (数値) の比較は、長さを与える関数 length() が使われる。
if ( length($b) >= 3 ) { print "The length of $b is > or = to 3.\n";}
# $_ に代入すれば、5.3 で示した パターンがあるかないかを使える。
#              ec という パターンが $_ にあれば....
$_ = $b; if ( /ec/ ) { print 'pattern ec is found',"\n"; }
        if (! /wc/ ) { print 'pattern wc is not found',"\n";}

特殊な例として、if(1) は常に真であり、if(0)は 常に偽である。 文字の場合には、文字が存在すれば if("a") 常に真、 文字列がない場合 if("") には 常に偽である。 if(<>) は、標準入力から文字があれば正しい。が特殊な場合として数字の 0 という文字列があれば、if("0") が(数値として)偽である点に注意したい。 Perl の場合には、このように 数字と文字を曖昧に扱うことが許されている。

6.1 elsif (注意! elseif でない) 及び else 文

if で正しくない場合には、else 以下を実行する。else が無くても良い。 ない場合には、次の文に進む。 if ( 条件 ) { 真の場合の処理 } else { 偽の場合の処理 }

または elsif で条件をいくらでも分けることができる。

if ( 条件1 ) { 条件1 = 真の場合の処理 }
elsif ( 条件2 ) { 条件1 = 偽 で 条件2 = 真の場合の処理 }
elsif ( 条件3 ) { 条件1,2 = 偽 で 条件3 = 真の場合の処理 }
else {全て偽の場合の処理}

elsif は何個あってっも良い。 場合分けをする場合には、elsif で長い 1 つの if 文を作った方が 、複数の if 文に分けるより処理上速い。

また2つの条件において、and や or の機能を && と || で、つなげて一つの 条件にする事ができる。

注意: elsif は elseif と書き間違えないように。csh や fortran を知っている人は特に注意。


(例題 6.1) elsif 文 else 文の例を示す。(p6-1.pl)
#!/usr/local/bin/perl
$_ = <>; # 一行入力し、$_ にいれる。
chop;    # $y についている改行の記号を取る。これで $y は文字だけになる。
# 入力した文字が y または Y で 始まれば yes と判断する。
if ( /[yY].*/ ) { print 'yes ですね。',"\n";} 
# でなければ n または N で始まれば no の判断する。
elsif( /[nN].*/ ) { print 'no ですね。',"\n";} 
else{print "$_", ' は yes か no かわかりません。',"\n"}

chop は、改行を取る関数である。一行を入力した場合には、その文字変数には、 改行の記号が最後についている。文字が等しいか確かめたいときには、改行の 記号は不要であるので、chop で落とす。$_ 以外の場合には、関数の普通の 使い方として、chop($a); のように使う。

6.2 引数の入力の受け渡し

コマンドで引数(ひきすう) を伴う場合がある。例えば、Unix で file を消す場合、% rm file であり、file が引数になる。 また % cp file1 file2 のように 2 つの引数 file1 file2 を 持つ場合がある。Perl のコマンドでも引数を伴って処理をする 場合を考えよう。
(例題 6.2) 引数のパターンがあるものを標準入力から探しその行を印刷する。 (p6-2.pl)
#!/usr/local/bin/perl
 $p = shift ; # shift は最初の引数を与える。
 while(<>) { print if (/$p/); } # もし各行に 引数のパターンがあれば印刷

これは Unix の grep の コマンドと同じ機能を持っている。grep の 2 番目の引数は file 名であるが、file からの入出力は、8章 で示す。 実行は

% p6-2.pl abc < file

で与えられる。Perl で引数は 配列 @ARGV で与えられる。(csh に似ている) 第一の引数が $ARGV[0] である。プログラムの名前は $0 に入る。 引数の個数は、$#ARGV である。一般に配列 @a の長さは、$#a で 与えられる。


(例題 6.2) コマンドの引数を表示する。(p6-3.pl)
#!/usr/local/bin/perl
print "$0 のコマンドの引数の数は、$#ARGV 個で、内容は @ARGV である\n";
print "特に最初の引数は、$ARGV[0] である。\n";

実際にコマンドを実行すると、

% p6-3.pl ok a b c
p6-3.pl のコマンドの引数の数は、3 個で、内容は ok a b c である
特に最初の引数は、ok である。
%
となる。