Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. 構文
  3. my

our - パッケージ変数の宣言

ourによるパッケージ変数の宣言について解説します。

パッケージ変数の宣言

パッケージ変数を宣言するにはourを使用します。

our $NUM;

パッケージ変数は、ひとつの名前空間に属するグローバル変数です。パッケージ変数は、修飾名(パッケージ名)を持ち、ソースコードのどの位置からでも参照できます。

パッケージ変数の変数名は「大文字」にするのが、Perlでは慣習となっています。

パッケージ変数の初期化

パッケージ変数の宣言と同時に「初期化」を行うことができます。

our $NUM = 5;

パッケージ変数のスコープと寿命

パッケージ変数の寿命とスコープについて解説します。

パッケージ変数の寿命

パッケージ変数は、宣言して初期化されると、プログラムの最後まで、その値は存在し続けます。

パッケージ変数のスコープ

スコープが終わると、パッケージ名なしで、参照できなくなります。完全修飾名を、使えば、参照できます。

package SomePackage;

our $package_var1;
$package_var1 = 1;

# ourのスコープ
{
  our $package_var2 = 2;
}
# スコープが終わると、完全修飾名でのみ、参照できる
$SomePackage::$package_var2;

スコープの詳しい解説については以下をご覧ください。

パッケージの宣言

Perlではパッケージの宣言は、他の言語の名前空間の宣言にあたります。一般的には、パッケージ名は大文字ではじめる。単語の区切りも大文字にします。

package SomePackage;

パッケージ変数は完全修飾名でアクセスすることもできます。

$SomePackage::package_var1

パッケージの宣言については詳しくは以下の記事をご覧ください。

mainパッケージ

パッケージの宣言が行われない場合、ourで宣言されたパッケージ変数は、mainパッケージに属します。

# 「$main::NUM」として「mainパッケージ」に属する
our $NUM;

Perlには、パッケージを持たない変数は存在しません。パッケージがないように見えるものは実は、mainパッケージに属しています。

たとえば特殊変数はパッケージに属さないように見えますが、mainパッケージに属しています。

ourによる変数宣言は使うべきか

自分でプログラムを書く場合は、ourによる変数宣言を使う機会は、ほとんどありません。より安全で速い「my」による変数宣言によって、完全なプログラムが書けてしまうからです。できる限り「our」は避けて「my」だけを使うようにしましょう。

myはレキシカルなスコープを持ちアクセス可能な範囲が小さく安全です。連続した領域にあるため変数へのアクセス速度が速いという特徴があります。

myによる変数宣言については以下の記事をご覧ください。

サンプル

パッケージ変数を使ったサンプルです。

use strict;
use warnings;

# パッケージ変数
print "1: パッケージ変数は、修飾名( SomePackage )を持ち".
    "プログラムのどの位置からも( スコープの外部からでも )参照できる。\n";
{
  # SomePackageに属するpackage_var1
  $SomePackage::package_var1 = 1; 
  
  # OtherPackageに属するpackage_var1;
  $OtherPackage::package_var1 = 2; 
}

print "\$SomePackage::package_var1 = $SomePackage::package_var1\n";
print "\$OtherPackage::package_var1 = $OtherPackage::package_var1\n\n";

実行結果

1: パッケージ変数は、修飾名( SomePackage )を持ちプログラムのどの位置からも( スコ
ープの外部からでも )参照できる。
$SomePackage::package_var1 = 1
$OtherPackage::package_var1 = 2
Qiitaで
「3分間Perlテキストクッキング」
という連載を始めました。
テキスト処理を題材にして、3分くらいで読める分量で、書いていきます。
文字コード、テキストデータ、コンピュータにおけるテキストの扱いなど、ソフトウェアの基礎の話題も
3分間Perlテキストクッキング