┌───────┐
│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▲]