Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. サブルーチン
  3. here

Perlのサブルーチンの柔軟性をC言語と比較してみる

Perlのサブルーチンの特徴をまとめておきます。C言語と比較してみました。Perlの言語としての柔軟性が理解できると思います。※1

Perlのサブルーチンの特徴

  Perl C言語
1 サブルーチンの定義はどこで行っても良い 一般的に、関数の前方宣言(プロトタイプ宣言)が必要
2 引数の型を宣言しておく必要がない 引数の型を宣言しておく必要がある。
3 戻り値の型を宣言しておく必要がない 戻り値の型を宣言しておく必要がある。
4 デフォルトで可変個の引数を受け取る 引数の個数を宣言時に決めておく必要がある
5 リストを戻り値として使用可能 配列を戻り値にすることはできない
6 レキシカル変数へのリファレンスを戻り値にできる ローカル変数のアドレスを戻り値にできない
7 コンテキストという概念がある コンテキストという概念はない
8 サブルーチンが属する名前空間がある 関数が属する名前空間はない

1. サブルーチンの定義はどこで行っても良い

# perl ( サブルーチンの定義はどこで行ってもよい )

func() # ここでも使えるし 

sub func {

}

func() # ここでも使える
/* C言語 ( 一般的には、前方宣言が必要 ) */

int func(int x); /* 関数プロトタイプ宣言 */

func(3) /* ここで、使うためには、前方宣言( プロトタイプ宣言 ) が必要 */

int func( int x ){

}

Perlでは、実行時にサブルーチンの名前をシンボルテーブルに探しにいきます。だから、どこにでも書くことができます。

C言語では、コンパイル時に、関数の名前が解決されます。関数を使う場所より後ろに関数定義があった場合は、使う場所より前で前方宣言( プロトタイプ宣言 ) がなされていなくてはなりません。

2. 3. 4. 引数の型、引数の個数、戻り値の型を、決めておく必要がない

# Perl (最初に決めておくことは、サブルーチンの名前だけ。)
sub func {

}
/* C言語 ( 引数の型、引数の個数、戻り値の型を決めておく必要がある。 ) */

int func(int x, int y) {

}

Perlでは、引数の型、引数の個数、戻り値の型は、実行時に決定されます。C言語では、引数の型、引数の個数、戻り値の型は、コンパイル時に決定されます。

5. リストを戻り値として使用可能

# Perl (リストを戻り値として使用可能)

sub func {
    return (1, 2, 3);
}
/* C言語 ( 配列を返却するには,引数で受け取ったポインタを操作する必要がある ) */

int ary[100];
fucn(ary); /* ポインタを渡す */

void func(int *ary) {
  /* ここで、ポインタを通じて、 ary に値を代入する必要がある。 */
}

Perlでは、リストを戻り値に、することができます。C言語では、配列を戻り値として返却することができません。呼び出し元へ、配列を返却したい場合は、引数で、ポインタとして渡して、それを操作する必要があります。

6. レキシカル変数へのリファレンスを戻り値にできる

# Perl 
sub func {
  my $val = 1;
  return \$val;
}
/* C言語 */
int func(){
    int x;
    return &x;
}

Perlでは、レキシカル変数は、どこかから参照されている限りは、メモリ上から破棄されません。C言語では、関数が終了してしまうと、ローカル変数は、破棄されてしまいます。

7. コンテキストという概念がある

Perlには、コンテキストに応じて、スカラーかリストを関数の戻り値として使用することができます。C言語には、このような概念はありません。

8. サブルーチンが属する名前空間がある

# Perl
# 本当の名前は、main::func ( mainパッケージに属するfuncサブルーチン )
sub func {

}

package SomePackage;
# 本当の名前は、SomePackage::func 
# ( SomePackageパッケージに属する funcサブルーチン ) 
# 上記のfuncとは、まったく別のもの
sub func {

}
/* C言語 */
/* func は func であり、プログラムのどこから見ても func です。*/
int func() {

}

Perlでは、すべてのサブルーチンは、名前空間に属します。Perlでは、名前空間のことをパッケージと呼びます。C言語は、名前空間を持ちません。

※1 Cを批判しているわけではないのであしからず。Cは、「実行速度が速い」「ハードウェアよりのプログラミングが可能」「低レベルなデータ操作が得意」という特徴を持ちます。Perlはこれが苦手なのです。

Giblog