Perlの哲学 - Perlに対する誤解を解く

Perlは単独のスコープがC言語と同じように使える

Perlは単独のスコープがC言語と同じように使えます。単独のスコープというのは、if文やfor文やwhile文と組み合わせて存在するスコープではなく、単独で定義できるスコープで、変数にスコープを与えることができるものをいいます。

Perlの単独のスコープ

Perlの単独のスコープです。

{
  my $foo = 1;
}

C言語の単独のスコープ

C言語の単独のスコープです。

{
  int32_t foo = 1;
}

Perlの単独のスコープとC言語の単独のスコープの比較

Perlの単独のスコープとC言語の単独のスコープの比較してみましょう。「{}」という記号で、スコープを作ることができます。

単独のスコープの活用法

単独のスコープは、そのスコープの中だけで、有効な変数を宣言することができるので、以下のような書き方ができて、便利です。入れ子にすることもできます。

{
  my $foo = 5;
  
  {
    my $foo = 1;
  }
  
  {
    my $foo = 2;
  }
  
  {
    my $foo = 3;
  }
}

Perlの場合は、リファレンスカウント式のGCなので、スコープの終わりで、変数を解放してくれるという効果もあります。

単独のスコープは、試験を書くときに非常に効果を発揮します。試験は、ほとんど同じことを、少しづつ変えて、何回も記述する作業だからです。サブルーチンを定義しないで、新しいスコープを記述できるというのは、とても便利なのです。

# テスト1
{
  my $baz = "abc";
  
  # テスト1 - サブテスト1
  {
    my $foo = 1;
    
    # ごにょ
    
    is($foo, 5);
  }

  # テスト1 - サブテスト2
  {
    my $foo = 3;
    
    # ごにょ
    
    is($foo, 10);
  }

  # テスト1 - サブテスト3
  {
    my $foo = 10;
    
    # ごにょ
    
    is($foo, -5);
  }
}

# テスト2
{
  my $baz = "def";

  # テスト2 - サブテスト1
  {
    my $bar = 2;
    
    # ごにょ
    
    is($bar, 3);
  }

  # テスト2 - サブテスト2
  {
    my $bar = 3;
    
    # ごにょ
    
    is($bar, 45);
  }

  # テスト2 - サブテスト3
  {
    my $bar = 20;
    
    # ごにょ
    
    is($bar, -19);
  }
}

PerlとC言語の他の類似点

この記事では、Perlの単独のスコープがC言語と似ているということを書きましたが、Perlのif文、for文、while文、インクリメント/デクリメント、演算子の優先順位、スコープ、参照概念も、C言語の文法と似ています。