Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発なら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とはテキスト処理の記述性とパフォーマンスに優れ、正規表現が言語に組み込まれているプログラミング言語です。
  • Linuxサーバーでのフィルタリングプログラム、複数行の文字列を処理、ファイル内容の検索・置換などが得意
  • Perlはgitopensslなど広く普及したUnix/Linuxミドルウェアの補助ツールとして採用実績あり。後方互換性とポータビリティの高さがひとつの理由と推測。
  • 大量のテキストを扱うWeb開発も得意。ロングテールSEOを意識したWebサイト、アドテクやソーシャルゲームでの50ms以内のJSONの生成など。