Akita National College of Technology Yamamoto's Laboratory
ホーム研究内容コンピューター講義ノート学内限定
 
 
C++
Perl
グラフ作成
 
 
 
 
 
 
コンピューター → Perl

Perl

Perlは,非常に多機能なインタープリンター言語です.機能が豊富なため,プログラムが短くて済みます.また,インタープリンターなので動作が簡単です.そのようなことからCGIで使われることが多いようです.私はCGIは使わずに全てPHPで書いており,Perlはちょっとしたプログラムに活用しています.このページはPerlに関する私のメモです.

目次

  1. 実行方法
  2. データ構造
  3. ファイル処理
  4. 文字列操作
  5. 制御文
  6. 関数
  7. 参考文献

実行方法

Perlのプログラムは,次に示す三通りの方法で実行できます.いずれも,"Hello World!"を表示するプログラムです.

  • 直接,コマンドラインから実行する方法
  • $ perl -e 'print "Hello World!\n";'
  • ファイルにプログラムを記述する方法
    1. ファイルにプログラム(hello.pl)を記述します.拡張子は,無くても良い.
    2. print "Hello World!\n"
      
    3. 実行させる.
    4. $ perl hello.pl 
  • ファイルに実行権限を与えて実行する方法
    1. ファイルにプログラム(hello.pl)を記述します.この場合も,拡張子は無くても良い.1行目は,perlの実行ファイルのあるパスです.
    2. #!/usr/bin/perl
      print "Hello World!\n";
      
    3. 実行権限を与え,実行させます.
    4. $ chmod +x hello.pl
      $ ./hello.pl
      

データ構造

perlは型指定が不要で,変数や配列などが簡単に使えます.変数名はには,アルファベットと数字,アンダースコア(_)が使えます.先頭はスカラー変数では$で配列では@となり,次にアルファベットあるいはアンダースコアになります.$や@の次に数字はダメです.$や@が付く以外は,C言語と同じです.もちろん,大文字と小文字は区別します.

$_は,特別な変数です.いろいろなところで,デフォルトの変数となっています.そのため,普通の変数として$_を使うことは望ましくありません.同様に@_もです.

  • スカラー変数  変数名の先頭に$をつけます.
  • $hoge=2;
    $fuga=314e-2;
    $foo="Hello World!";
    $a=$hoge;
    $b=$fuga;
    $c=foo;
    
  • 配列  配列名の先頭に@をつけます.配列の要素にアクセスするときには$と[]を使います.文字と数値をひとつの配列の中に混在させることもできます.
  • @hoge=(31, 24, 1, 5, 923);   # 配列の初期化
    @fuga=@hoge;                  # 配列間の代入
    $n=@hoge;                     # $nは@hoge要素数が代入される $nは5に
    $a=$hoge[1];                  # $aは24になる
    $hoge[0]=333;                 # @hoge=(333, 24, 1, 5, 923)に
    
    @test=("suzuki",49,"sato",89,"tanaka",73,"yamamoto",65);
    
  • 連想配列(ハッシュ)  配列名の先頭に%をつけます.通常の配列では,要素へのアクセスは整数のインデックスを使います.それに対して連想配列(associative array)では,キーと呼ばれる文字列を使って要素へアクセスします.
  • %animal=(Tom => 'cat', Bucci => 'cat');      # キーはTOMとBucci,値はcatとcat
    $animal{'Jerry'} = 'mouse';                   # 連想配列に追加
    delete $animal{'Bucci'};                      # データの削除
    
    print "$animal{'Tom'}\n";                     # catと表示;
    @animal_key =  keys(%animal);                 # キーを取り出して,配列に格納
    @animal_value = values(%animal);             # 値を取り出して,配列に格納
    
    while(($name, $species)=each(%animal)){      # 全てのキーと値を表示
        print "Key:$name    Value:$species\n";
    }
    

ファイル処理

  • ディレクトリー hogehoge にある拡張子が txt のファイルを操作する.
  • #!/usr/bin/perl
    
    $dir="hogehoge";
    
    opendir(DIR,$dir) or die "$dir can not be opened.\n $!";
    chdir($dir);
    
    while ($file=readdir(DIR)){
        if ($file=~ /.txt/ ){
    	open(IN,$file) or die "IN file can not be opened.";
    	while<IN>{
    	    #--------------------------------------------------
    	    # ここに処理を書く
    	    # $_に各行の内容が格納される
    	    #--------------------------------------------------
    	}
    	close(IN);
        }
    }
    

文字列操作

正規表現

  • パターン  以下のような演算子を使って,文字列のパターンを示す.
  • [abcXYZ] a,b,c,X,Y,Zのどれかひとつ
    [a-z] a〜zのどれかひとつ
    [C-W5-7] C〜W,あるいは5〜7のどれかひとつ
    [^ab] 'a'と'b'以外にマッチ.ブラケット直後の ^ は否定
    hoge | fuga hoge あるいは fuga のいずれか
    . 改行文字(\n)以外の任意の1文字
    \s と \S \s は空白文字*1にマッチ.\Sはその否定.
    \d と \D \d は0〜9の数字にマッチ([0-9]と同じ).\D はその否定.
    \w と \W 英文字と英数字([a-zA-Z0-9])]にマッチ.\W はその否定.
    * 直前の文字がゼロ個以上
    + 直前の文字が1個以上
    ? 直前の文字が0個または1個
    {3,8} 直前の文字が3個以上,8個以下
    {6} 直前の文字が6個
    {7,} 直前の文字が7個以上
    (パターン) 「\整数」で括弧内の文字列を参照できる*2
    \b と \B \b は単語境界,\B は単語境界ではない.
    ^ 直後が文字列の先頭
    $ 直前が文字列の末尾
    • *1 空白文字とは,「スペース,CR, Tab, LF, 改ページ」のこと.
    • *2 /xx(.)yy([a-z])zz\2\1/は,「xx9yyazza9や「xxByykzzkB」にマッチする.\1は最初の括弧内の . に対応した文字列(ここでは文字),\2は次の括弧内の文字列になる.

  • 優先順位  演算子の優先順は,(1)括弧「()」,(2)繰り返しを表す「*,+,?,{3,8}」,(3)並び,位置指定,(4)または「|」です.このページに詳しく書いてある.

正規表現を使った操作

文字列の操作に正規表現を使う場合,/正規表現/とスラッシュで囲む.最後に i を付けると大文字と小文字の違いを無視する(ignore case).

  • 比較  正規表現を使って,比較ができます.比較の結果は,真(TRUE)か偽(FALSE)です.
  • if(/abc/){
        # $_に'abc'が含まれていれば,実行
    }
    
    if($hoge=~/xyz/){
        # $hogeに'xyz'が含まれていれば,実行
    }
    
    if($fuga=~/stu/i){
        # $fugaに,大文字でも小文字の違いを無視して'stu'が含まれていれば,実行
    }
    
  • 置換  s/元の文字列/新文字列/で文字列の置換ができます.
    • 最初にマッチした文字列のみを変換します.マッチする全てを変換する場合は,gオプションを付ける.
    • 大文字と小文字の違いを無視してマッチさせる場合,iオプションを付ける.
    s/old/new/;                  # $_中の'old'を'new'に置換
    $hoge =~ s/.txt$/.dat/;    # $hoge中の末尾の'.txt'を'.dat'に置換
    $fuga =~ s/(^.)/aaa $1/;   # $fugaの文字列の先頭に'aaa 'を追加
    $foo =~ s/ok/NG/i;          # 大文字,小文字の関係なく'ok'を'NG'に
    $bar =~ s/a/A/g;            # 全ての'a'を'A'に
    $aaa =~ s/god/Satan/ig;    # iとgオプションの両方を使う
    

文字列の分割と結合

  • splitによる分割  文字列を分割する場合,split(デリミタ,文字列)を使うと簡単です.
  • $sentence='To be or not to be, that is the question;';
    @word=split(/\s+|,\s*|;\s*/, $sentence);
    # $sentenceが単語に分けられて,@wordに格納
    # @word=('To','be','or','not','to','be','that','is','the','question')となる
    
    @test=split(/:/);         # この場合は,$_の文字列をコロンで分割
    
  • joinによる結合  配列に格納された文字を結合する場合,join(はさむ文字,配列)を使うと簡単です.
  • @word=('If','winter','comes','can','spring','be','far','behind');
    $sentence=join(" ",@word);
    # $sentence='If winter comes can spring be far behind'となる.
    
  • .による結合  単純な結合の場合は,.(ピリオド)を使うと簡単です.
  • $a='Time';
    $b='money';
    $capitalism=$a.' is '.$b.'.';
    # $capitalism='Time is money.'となる.
    

制御文

  • foreach  配列のデータを順次呼び出し繰り返し処理する場合,便利な文です.
  • foreach $var(@array){
      # ここに処理の内容を書く.
      # @arrayの個々の内容が,$varに格納される.
    }
    

    もし,$varを省略すると,$_に@arrayの内容は,格納されます.

関数

  • main関数  perlにはメイン関数がありません.
  • コマンドライン引数  @ARGVにセットされます.例えば,「foo.pl hoge fuga」と実行すると,$ARGV[0]は'hoge',$ARGV[1]は'fuga'となる.
  • #!/usr/bin/perl
                             # foo.pl hoge fuga と実行する
    print "$ARGV[0]\n";    # hogeと表示
    print "$ARGV[1]\n";    # fugaと表示
    

    もし,コマンドライン引数に,ワイルドカードを使ったファイル名を指定すると,$ARGV[0], $ARGV[1], $ARGV[2], …に展開されたファイル名が格納さます.ファイルは,foreach文を使って処理するのがセオリーでしょう.

    foreach $file(@ARGV){
      # ここに処理の内容を書く.
      # $fileにワイルドカードで表されたファイル名が格納される.
    }
    
  • ユーザー定義関数
    • 関数の呼び出しは,&関数名 とする.
    • 引数があるときは,&関数名(実引数リスト) とする.
    • ユーザー定義関数は,sub 関数名{処理の内容}とする.
    • 引数の値は,配列 @_ に格納される.
    • 戻り値は,関数で最後に評価された式の値となる.
    • Perlの変数はグローバルなので,引数や戻り値を使わなくても,ユーザー定義関数と呼び出し側でデータの受け渡しができる.
    #!/usr/bin/perl
    
    $var=&average(3,6);        # 引数を伴って,ユーザ定義関数の呼び出し
    print "$var\n";             # 4.5が表示される
    
    sub average{
        $sum=$_[0]+$_[1];      # 引数は @_ に
        $ave=$sum/2;            # 戻り値は最後に評価された式の値
    }
    
    sub hogehoge{
        my($arg1,$arg2,$arg3)=@_;       # 少しスマートな方法
                                           # $arg1〜$arg3はローカル変数
          # ユーザー定義関数の処理を書く
    }
    
  • 変数のスコープ  @_を除いて,Perlの変数はグローバル変数です.@_ をグローバルにすると,関数の中で関数を呼び出すときに不便が生じます.なぜならば,@_ に実引数の値が格納されるからです.
  • ローカル変数  my あるいは local を使って,ローカル変数にすることができる.myが普通の言語(例えばC言語)のローカル変数に対応する.詳細は,こちら
    • my で宣言すると,新たにメモリーが割り当てられ,そのブロック内{}でのみ参照や変更ができる.普通に言うローカル変数なので,できるだけこちらを使う.
    • local で宣言すると,宣言した関数から呼び出した関数でも参照や変更ができる.
    #!/usr/bin/perl
    
    $var="main_var";             # グローバル変数
    
    &my_sub1;
    &local_sub1;
    
    sub my_sub1{
        my $var="my_var";        # my を使ってローカル変数を宣言
        print "$var\n";          # 'my_var'と表示
        &my_sub2;
    }
    
    sub my_sub2{
        print "$var\n";          # 'main_var'と表示 重要
    }
    
    sub local_sub1{
        local $var="local_var";  # local を使ってローカル変数を宣言
        print "$var\n";           # 'local_var'と表示
        &local_sub2;
    }
    
    sub local_sub2{
        print "$var\n";          # 'local_var'と表示 重要
    }
    

参考文献・WEBサイトなど


last update:2009/03/03 16:04:34