以下のスクリプトはCSVファイルを読み込み、条件に合致する特定の行のデータだけをタブ区切りファイルとして出力するPerlのスクリプトです。
入力データを編集して、出力データを作成する場合、ある項目が特定の値をもつレコードだけを出力する場合があります。リレーショナル・データベース(relational data base)でいうと、選択(selection)に相当するものですが、このような場合、if文を利用することになります。
if文は、「if (条件) { 条件に該当する場合に行う処理 }」という形式で記述します。通常、「条件に該当する場合に行う処理」は、わかりやすくするため、改行して記述します。このため、「}」(ブレースの右かっこ)は改行して、「if」と同じカラム(桁)にそろえるとわかりやすくなります。
また、if文も、while命令と同じように「;」(セミコロン)はつけないので注意してください(ただし、「{}」(ブレース)の中に指定する「条件に該当する場合の処理」には、それぞれ「;」(セミコロン)をつける必要があります)。
条件がいくつかに別れていて、それぞれ別々の処理を行う場合は、以下のように「else」や「elsif」を使って記述します。なお、「else」に該当する処理がなければ、省略することができます。また、「elsif」はいくつでも追加することができます。
if (条件A) { 条件Aに該当する場合に行う処理 }
if (条件A) { 条件Aに該当する場合に行う処理 } else { 条件A以外に該当する場合に行う処理 }
if (条件A) { 条件Aに該当する場合に行う処理 } elsif (条件B) { 条件A以外で条件Bに該当する場合に行う処理 }
if (条件A) { 条件Aに該当する場合に行う処理 } elsif (条件B) { 条件A以外で条件Bに該当する場合に行う処理 } else { 条件Aにも条件Bにも該当しない場合に行う処理 }
「elsif」は、「elsif」で指定している条件の他に、それ以前に記述している「if」や「elsif」以外の条件であることが前提になっているので、記述する順序については、よく考えておくことが必要です。さまざまなパターンを想定しておかないと、いくつも条件があるのに、すべてのデータが最初の条件だけに該当してしまうということが起きることがあります。
それぞれの条件がandやorで接続されて複合的になる場合は、それぞれ個別の条件ごとに「()」(かっこ)を使うだけでなく、条件全体にも「()」をつけます。Perlでは、and条件を「&&」、or条件を「||」(一般的な日本語109キーボードでは、[Back Space]キーの左隣、「\」のあるキー)で指定します。
また、条件そのものは、一般的に比較演算子を使って記述します。比較演算子とは、2つの項目の大小関係を規定するための記号です。
Perlでは、変数が文字列か数値かによって、比較演算子が異なっている点に注意する必要があります。記述方法は、比較演算子の左側に変数、右側に変数または定数を記述します。定数は、文字列の場合、「""」(ダブルクォーテーション)でかこみ、数値の場合はそのまま記述します。それぞれの場合を表にまとめたので、参考にしてください。
内容 | 比較演算子 (文字列) |
比較演算子 (数値) |
使用例 | 備 考 |
等しい | eq | == |
$a eq $b $a == $b |
$a は $b に等しい |
等しくない | ne | != |
$a ne $b $a != $b |
$a は $b に等しくない |
大きい | gt | > |
$a gt $b $a > $b |
$a は $b より大きい |
小さい | lt | < |
$a lt $b $a < $b |
$a は $b より小さい |
以上 | ge | >= |
$a ge $b $a >= $b |
$a は $b 以上である |
以下 | le | <= |
$a le $b $a <= $b |
$a は $b 以下である |
内容 | 比較演算子 (文字列) |
比較演算子 (数値) |
使用例 | 備 考 |
等しい | eq | == |
$a eq "abc" $a == 0 |
$a は "abc" に等しい $a は 0 に等しい |
等しくない | ne | != |
$a ne "abc" $a != 0 |
$a は "abc" に等しくない $a は 0 に等しくない |
大きい | gt | > |
$a gt "abc" $a > 0 |
$a は "abc" より大きい $a は 0 より大きい |
小さい | lt | < |
$a lt "abc" $a < 0 |
$a は "abc" より小さい $a は 0 より小さい |
以上 | ge | >= |
$a ge "abc" $a >= 0 |
$a は "abc" 以上である $a は 0 以上である |
以下 | le | <= |
$a le "abc" $a <= 0 |
$a は "abc" 以下である $a は 0 以下である |
具体的なスクリプトとサンプルの入力データをつけますので、それぞれの場合(#から次の#までの間)を1つ1つコピーし、実行してみてください。結果は、出力データで示したようになるはずです。
# inout4.pl # 内容 : if文のテスト # Copyright (c) 2002 Mitsuo Minagawa, All rights reserved. # 使用方法 : c:\>perl inout4.pl # #if文で条件が1つの場合 open(IN1,"input.txt"); open(OUT1,">output1.txt"); while ($line1 = <IN1>) { chomp($line1); @in1 = split(",",$line1,-1); if ($in1[0] eq "AAAA") { $out1 = join("\t",@in1); print OUT1 "$out1\n"; } } close(IN1); close(OUT1); #if文でelseをつける場合 open(IN1,"input.txt"); open(OUT1,">output2.txt"); while ($line1 = <IN1>) { chomp($line1); @in1 = split(",",$line1,-1); if ($in1[0] eq "AAAA") { $out1 = join("\t",@in1); print OUT1 "$out1\n"; } else { $in1[1] = "9999"; $out1 = join("\t",@in1); print OUT1 "$out1\n"; } } close(IN1); close(OUT1); #if文でelsifをつける場合 open(IN1,"input.txt"); open(OUT1,">output3.txt"); while ($line1 = <IN1>) { chomp($line1); @in1 = split(",",$line1,-1); if ($in1[0] eq "AAAA") { $out1 = join("\t",@in1); print OUT1 "$out1\n"; } elsif ($in1[0] eq "BBBB") { $in1[1] = "1111"; $out1 = join("\t",@in1); print OUT1 "$out1\n"; } } close(IN1); close(OUT1); #if文でelsifとelseをつける場合 open(IN1,"input.txt"); open(OUT1,">output4.txt"); while ($line1 = <IN1>) { chomp($line1); @in1 = split(",",$line1,-1); if ($in1[0] eq "AAAA") { $out1 = join("\t",@in1); print OUT1 "$out1\n"; } elsif ($in1[0] eq "BBBB") { $in1[1] = "1111"; $out1 = join("\t",@in1); print OUT1 "$out1\n"; } else { $in1[1] = "8888"; $out1 = join("\t",@in1); print OUT1 "$out1\n"; } } close(IN1); close(OUT1); #if文でandやorを使う場合 open(IN1,"input.txt"); open(OUT1,">output5.txt"); while ($line1 = <IN1>) { chomp($line1); @in1 = split(",",$line1,-1); if (($in1[0] eq "AAAA") && ($in1[1] == 1111)) { $out1 = join("\t",@in1); print OUT1 "$out1\n"; } else { $in1[1] = "9999"; $out1 = join("\t",@in1); print OUT1 "$out1\n"; } } close(IN1); close(OUT1);
AAAA,1111,1000,2000,3000 AAAA,2222,1000,2000,3000 AAAA,1111,1000,2000,3000 AAAA,3333,1000,2000,3000 BBBB,1111,1000,2000,3000 BBBB,2222,1000,2000,3000 BBBB,3333,1000,2000,3000 CCCC,1111,1000,2000,3000 CCCC,2222,1000,2000,3000 CCCC,3333,1000,2000,3000
AAAA 1111 1000 2000 3000 AAAA 2222 1000 2000 3000 AAAA 1111 1000 2000 3000 AAAA 3333 1000 2000 3000
AAAA 1111 1000 2000 3000 AAAA 2222 1000 2000 3000 AAAA 1111 1000 2000 3000 AAAA 3333 1000 2000 3000 BBBB 9999 1000 2000 3000 BBBB 9999 1000 2000 3000 BBBB 9999 1000 2000 3000 CCCC 9999 1000 2000 3000 CCCC 9999 1000 2000 3000 CCCC 9999 1000 2000 3000
AAAA 1111 1000 2000 3000 AAAA 2222 1000 2000 3000 AAAA 1111 1000 2000 3000 AAAA 3333 1000 2000 3000 BBBB 1111 1000 2000 3000 BBBB 1111 1000 2000 3000 BBBB 1111 1000 2000 3000
AAAA 1111 1000 2000 3000 AAAA 2222 1000 2000 3000 AAAA 1111 1000 2000 3000 AAAA 3333 1000 2000 3000 BBBB 1111 1000 2000 3000 BBBB 1111 1000 2000 3000 BBBB 1111 1000 2000 3000 CCCC 8888 1000 2000 3000 CCCC 8888 1000 2000 3000 CCCC 8888 1000 2000 3000
AAAA 1111 1000 2000 3000 AAAA 9999 1000 2000 3000 AAAA 1111 1000 2000 3000 AAAA 9999 1000 2000 3000 BBBB 9999 1000 2000 3000 BBBB 9999 1000 2000 3000 BBBB 9999 1000 2000 3000 CCCC 9999 1000 2000 3000 CCCC 9999 1000 2000 3000 CCCC 9999 1000 2000 3000