Perlゼミ

  1. Perl
  2. モジュール作成

型グロブを理解する

型グロブは、シンボルテーブルのエントリーを表現します。

 *main::num # $main::{num} とほぼ同じ意味。
 *num # パッケージ名を省略することもできます。 

シンボルテーブル上の、 $main::{num} には、'*main::num' という文字列が代入されていますが、ずばりこれを表します( シンボルテーブルのエントリーと呼ばれている。たぶん )。ただし、文字列ではなく、型グロブというものになります。

パッケージ名を省略すると、現在のカレントパッケージのシンボルテーブルのエントリになります。

型グロブと変数

my $num_from_typedglob = ${*main::num}; # $numと同じ
my @num_from_typedglob = @{*main::num}; # @numと同じ
my %num_from_typedglob = %{*main::num}; # %numと同じ
my $ret_from_typedglob = &{*main::num}; # &numと同じ( num() とも同じ )

型グロブは、一種のハッシュであり、スカラー変数配列ハッシュサブルーチンなどにアクセスすることができます。デリファレンスと見た目が、まったく同じですが、デリファレンスではありません。

型グロブのイメージ

|-------------|
| *typedglob  |--|
|-------------|  |
                 |      |-----------------|
                 |----->| ${ *typedglob } |
                 |      |-----------------|
                 |----->| @{ *typedglob } |
                 |      |-----------------|
                 |----->| %{ *typedglob } |
                 |      |-----------------|
                 |----->| &{ *typedglob } |
                        |-----------------|

サンプル

型グロブとシンボルテーブルを理解するためのサンプルです。

use strict;
use warnings;

# 型グロブ
# *typedglob;
# シンボルテーブルのエントリーを表現する。


# 名前が同じで、ファニー文字($, @, %)だけが異なる変数
our $num = 11;
our @num = (12, 13);
our %num = (key => 14);

# 名前が同じサブルーチン
sub num {
  return 15;
}

require Data::Dumper;

print "1-1: シンボルテーブルから、変数にアクセスする。\n";
# ${ } で括ると、スカラーのエントリ
my $num_from_symbol = ${$main::{num}};
# @{ } で括ると、配列のエントリ
my @num_from_symbol = @{$main::{num}};
# %{ } で括ると、ハッシュのエントリ
my %num_from_symbol = %{$main::{num}};

print Data::Dumper->Dump([$num_from_symbol], ['*num_from_symbol']);
print Data::Dumper->Dump([\@num_from_symbol], ['*num_from_symbol']);
print Data::Dumper->Dump([\%num_from_symbol], ['*num_from_symbol']);
print "\n";

print "1-2: シンボルテーブルから、サブルーチンを呼び出す。\n";
my $ret_from_symbol = &{$main::{num}}; # &{ } で括ると,サブルーチンのエントリ
print "\$ret_from_symbol = $ret_from_symbol\n\n";

print "2-1: 型グロブから、変数にアクセスする。\n";
my $num_from_typedglob = ${*main::num}; # ${ } で括ると、スカラーのエントリ
my @num_from_typedglob = @{*main::num}; # @{ } で括ると、配列のエントリが
my %num_from_typedglob = %{*main::num}; # %{ } で括ると、ハッシュのエントリ

print Data::Dumper->Dump([$num_from_typedglob], ['*num_from_typedglob']);
print Data::Dumper->Dump([\@num_from_typedglob], ['*num_from_typedglob']);
print Data::Dumper->Dump([\%num_from_typedglob], ['*num_from_typedglob']);
print "\n";

print "2-2: 型グロブから、サブルーチンを呼び出す。\n";
my $ret_from_typedglob = &{*main::num};
print "\$ret_from_typedglob = $ret_from_typedglob\n\n";
Perlの書籍
  • 業務に役立つPerl

    ログ解析など日本語を含むテキスト処理の実践!
    この私、Perlゼミの作者が執筆しています。
    ご購入、口コミ歓迎。
  • Perlの書籍 »
自己紹介
木本裕紀

「今日も元気だ、Perlで元気。
ゆとりあるITエンジニアライフのために
Perl情報を前向きに発信中!」

Twitter
フォロー、いいね、リツート、コメント歓迎

Youtube

チャンネル登録、いいね、コメント歓迎

kimoto.yuki@gmail.com
応援メッセージ、質問、間違い報告歓迎

木本システム株式会社
ご紹介キャンペーン実施中です。契約金額の10%をご紹介料としてお支払い。

(例)30万円のシステム開発委託契約が、1年続いたら、36万円がもらえる!!!