┌───────┐
│perl超入門(2) │
│ 2002/10/20 │
└───────┘
[▲Perl Home▲]
●データ入力
◆コマンドライン引数
・コマンドライン引数は@ARGV配列にリストとして保存される。
┌─────────────────────────────────────┐
print "@ARGV\n";
print "$#ARGV\n";
print "$ARGV[0]\n";
print "$ARGV[1]\n";
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
<引数指定ある場合>
C:\>jperl test.pl argv1 argv2 argv3
argv1 argv2 argv3
2 <---返ってくるのは個数ではなく最終添字番号である
argv1
argv2
------------------------------
<引数指定無い場合>
C:\>jperl test.pl
-1 <--- 引数無い場合、0未満の数値が返ると思われる。
└─────────────────────────────────────┘
◆標準入力
・標準入力からのデータは<STDIN>から受ける。
(例) $data = <STDIN>;
・この際、変数には改行文字(\n)も含まれる。改行文字を取り除くには、chop関数を
利用する。chopが適用されたデータからは、最後の1文字が取り除かれる。
(例) chop($data);
┌─────────────────────────────────────┐
print "data1 = ";
$data1 = <STDIN>;
chop($data1);
print "data2 = ";
$data2 = <STDIN>;
chop($data2);
print "Sum = ", $data1 + $data2;
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
<キ−ボード入力>
data1 = 10 <---キーボード入力
data2 = 20 <---キーボード入力
Sum = 30
--------------------------------
<リダイレクト入力>
[data.txt]
┌─┐
│10│
│20│ <--- 20の後ろに改行データを入れている
│ │ 入れない場合0がchopされてデータが2になってしまう
└─┘
C:>jperl test.pl < data.txt
data1 = data2 = Sum = 30
└─────────────────────────────────────┘
◆無名ファイルハンドル
・無名ファイルハンドル<>は、コマンドラインで指定されたファイル($ARGV[0])に結
合されている。
┌─────────────────────────────────────┐
$data1 = <>;
print "data1 = $data1";
chop($data1);
$data2 = <>;
print "data1 = $data2";
chop($data2);
print "Sum = ", $data1 + $data2;
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
[data.txt]
┌─┐
│10│
│20│ <--- 20の後ろに改行データを入れている
│ │ 入れない場合0がchopされてデータが2になってしまう
└─┘
C:>jperl test.pl data.txt
data1 = 10
data1 = 20
Sum = 30
└─────────────────────────────────────┘
◆指定ファイルオープン
・ファイルハンドルを特定のファイルと結びつけるには、open()関数を使用。
open(ファイルハンドル名, "<ファイル名");
・ファイルハンドルからデータを受け取るのは以下となる。
$スカラー変数 = <ファイルハンドル>;
・尚、open()で開いたファイルは、close()関数で閉じる。
close(ファイルハンドル名);
┌─────────────────────────────────────┐
open(DAT, "<data.txt");
$data1 = <DAT>;
print "data1 = $data1";
chop($data1);
$data2 = <DAT>;
print "data1 = $data2";
chop($data2);
print "Sum = ", $data1 + $data2;
close(DAT);
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
[data.txt]
┌─┐
│10│
│20│ <--- 20の後ろに改行データを入れている
│ │ 入れない場合0がchopされてデータが2になってしまう
└─┘
C:>jperl test.pl
data1 = 10
data1 = 20
Sum = 30
└─────────────────────────────────────┘
●条件分岐
◆if文
・条件文が真の場合、ブロックが実行される。
if (条件文) {
実行文ブロック
}
・条件文の括弧()は省略できるが、可読性が落ちるのでお勧めしない。
・実行文が1行の場合、修飾子記述を使った方がシンプル
実行文 if (条件式);
┌─────────────────────────────────────┐
print "数字を入れて!! : ";
$data = <STDIN>;
chop($data);
if ($data == 1) {
print "1を入力しましたね\n";
print "やっぱり1ですよね"
}
print "いきなり2ですか...\n" if ($data == 2);
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
C:>jperl test.pl
数字を入れて!! : 1
1を入力しましたね
やっぱり1ですよね
C:>jperl test.pl
数字を入れて!! : 2
いきなり2ですか...
└─────────────────────────────────────┘
・「==」はスカラー変数の内容が「数値データ」として等しいかどうかを調べる比較
演算子。
◆unless文
・unlessは条件式が「偽」のときに実行を制御する。あとはifと同じ。
[複数文制御]
unless (条件文) {
実行文ブロック
}
[単一文制御]
実行文 unless (条件文);
┌─────────────────────────────────────┐
print "パスワード入力 : ";
$data = <STDIN>;
chop($data);
unless ($data eq 'ginats') {
print "sorry!!";
}
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
パスワード入力 : tigers
sorry!!
└─────────────────────────────────────┘
・「eq」はスカラー変数の内容が「文字列データ」として等しいかどうかを調べる比
較演算子。
◆if-else文
・条件が真ならifが指定したブロックを、偽ならelseが指定したブロックを実行。
if (条件文) {
if 実行ブロック
} else {
else 実行ブロック
}
┌─────────────────────────────────────┐
print "パスワード入力 : ";
$data = <STDIN>;
chop($data);
if ($data eq 'giants') {
print "welcome!!";
} else {
print "sorry!!";
}
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
C:>jperl test.pl
パスワード入力 : tigers
sorry!!
C:>jperl test.pl
パスワード入力 : giants
welcome!!
└─────────────────────────────────────┘
◆if-elsif-else文
・条件が複数ある場合に使用する。
if (条件式1) {
実行ブロック1
} elsif (条件式2) {
:
:
} elsif (条件式n) {
実行ブロックn
} else {
デフォルト実行ブロック #無くても良い
}
┌─────────────────────────────────────┐
print "パスワード入力 : ";
$data = <STDIN>;
chop($data);
if ($data eq 'giants') {
print "Giants!!";
} elsif ($data eq 'tigers'){
print "Tigers";
} else {
print "Other Team";
}
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
C:>jperl test.pl
パスワード入力 : giants
Giants!!
C:>jperl test.pl
パスワード入力 : swallows
Other Team
C:>jperl test.pl
パスワード入力 : tigers
Tigers
└─────────────────────────────────────┘
●ループ制御
◆for文
・変数の条件でループさせる。条件が真の間は実行する。
for (変数初期値; 実行条件; 実行後操作) {
実行ブロック
}
┌─────────────────────────────────────┐
for ($index=0; $index <= $#ARGV; $index++){
print "$index : $ARGV[$index]\n";
}
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
C:>jperl test.pl a b c d
0 : a
1 : b
2 : c
3 : d
└─────────────────────────────────────┘
・「++」数値データをインクリメントする演算子。
・ちなみにデクリメントは「--」。
・「<=」は「以下」を表す比較演算子。「<, >, >=」も同様に使用できる。
◆foreach文
・foreachではスカラー変数にリストを代入し、その個数だけループさせる。
・リスト(配列)を指定することもできる。
・リスト指定時は、内容を受けるスカラー変数にデフォルトの「$_」を使用できる。
・「$_」は入力操作を省略したときにあてがわれるスカラー変数。(多用されるので要
チェック!!)
┌─────────────────────────────────────┐
[Sample1]
foreach $data ('上野', '日暮里', '三河島', '南千住', '北千住') {
print "$data\n";
}
[Sample2]
@Jyoban = ('上野', '日暮里', '三河島', '南千住', '北千住');
foreach $data (@Jyoban) {
print "$data\n";
}
[Sample3]
@Jyoban = ('上野', '日暮里', '三河島', '南千住', '北千住');
foreach (@Jyoban) {
print "$_\n";
}
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
上野
日暮里
三河島
南千住
北千住
└─────────────────────────────────────┘
◆while文
・whileは条件式が真の間実行するループ。
while (条件式) {
実行ブロック
}
・実行文が1行の場合、if/untilと同様に修飾子的に記述できる。
実行文 while (条件式);
┌─────────────────────────────────────┐
while (<>) { # <--- $_ = <>の意味。$_は省略。データあればtrue。
print "data : $_";
}
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
[data.txt]
┌─┐
│10│
│20│
└─┘
C:>jperl test.pl data.txt
data : 10
data : 20
└─────────────────────────────────────┘
◆until文
・untilは条件式が偽の間実行するループ。
until (条件式) {
実行ブロック
}
・後の扱いは修飾子記述を含めwhileと全く同様。
以上
[▲Perl Home▲]