2008年08月11日

[Perl]リファレンスの使い方(変数編)

 自分の防備録として。

 リファレンスの使い方(変数編)です。関数編は未定。

 リファレンスというのは、変数などのメモリ上の位置を記録した情報のこと・・・らしい。
 Cプログラマには“ポインタのようなもの”と言えばわかる・・・らしい。

 で、どんなときに使うかと言えば、週末プログラマにとっては、やはりサブルーチンに複数の配列やハッシュを渡したいときでしょうか。あと、サブルーチンが複数の配列やハッシュを返すときにも使えます。
 サブルーチンに複数の配列を投げても、@_というひとつの配列としか受け取ってくれません。配列をデリミタでつないで無理矢理複数のスカラー変数として渡してしまう方法もなきにしもあらずですが、もっとスマートな方法がリファレンスを使うという方法。
 サブルーチンに配列そのものを渡すのではなく、配列が格納されているメモリ位置の情報(要は「メモリの何番から何番まで」という情報)をスカラー変数として渡せば、複数の配列・ハッシュをサブルーチンに投げられます。

 リファレンスを生成するには、元の変数の前に\(バックスラッシュ・円マーク)をつけます。
  例) $a = \$hoge; $b = \@number; $c = \%city;

 リファレンスに記録されたもとの値を参照するには、リファレンスの前に$@%の記号をつけます。
  例) $x = $$a; @y = @$b; $z = %$c;
  この場合、$$b[1]や$$c{'uji'}や$b->[1]や$c->{'uji'}の様な書き方も可能。

つける場所をよく忘れるので憶えておく。

追記に、挙動確認に使用したプログラムを置いておきます。


#!/usr/bin/perl

use strict;
use warnings;

#ハッシュへのリファレンスの動作

#ナンバーズのハッシュを定義
my %numbers = (
1 => "Uno",
2 => "Due",
3 => "Tre",
4 => "Quattro",
5 => "Cinque",
6 => "Sein",
7 => "Sette",
8 => "Otto",
9 => "Nove",
10 => "Dieci",
11 => "Wendi",
12 => "Deed"
);

#ハッシュnumbersのリファレンスをkansuに投げ、
#結果(ハッシュのリファレンス)をスカラーr_numで受ける。
#リファレンスを作るには、その変数の前に\をつける。
my $r_num = &kansu(\%numbers);

#ハッシュnumにr_numのリファレンス元の値を代入
#リファレンスから復元するには、変数記号?($,@,%)の後ろに$をつける。
my %num = %$r_num;

#ハッシュnumのキーを数値として降順ソートし
#キーと中身をプリント
foreach(sort {$b<=>$a} (keys %num)){
print "$_ => $num{$_}\n";
}

exit;

sub kansu{
my $ref = $_[0];
my %kansu = (
1 => "壱",
2 => "弐",
3 => "参",
4 => "四",
5 => "五",
6 => "六",
7 => "七",
8 => "八",
9 => "九",
10 => "拾",
11 => "拾壱",
12 => "拾弐"
);

my %kan;
foreach(keys %$ref){
$kan{$_} .= $kansu{$_};
}
return(\%kan);
}


これは、1〜12のナンバーズのアルファベット表記に漢数字を加えて、降順にプリントします。


posted by 鯖缶 at 02:57 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。