x.x.x.x

| HOME | FrontPage | 記事編集 | RSS |

参照の配列要素とか配列要素の参照とか   Perl

  1. 1. 参照の配列要素のデリファレンス
  2. 2. 配列中の参照のデリファレンス
  3. 3. 配列要素の参照
  4. 4. いきなり無名配列を使う
  5. 5. でもやるな

まとめないと酷い。

1. 参照の配列要素のデリファレンス

以下のように書きます。

use strict;
my @array = (1,2,3,4,5);
my $r = \@array;
print $r->[0];

表示は1です。print $$r[0];でも良いのですが、配列、ハッシュ、関数の参照については、矢印演算子を使って記述する方法が望ましいとされています。

2. 配列中の参照のデリファレンス

以下のように書きます。

use strict;
my @array;
my $tmp = 1;
$array[0] = \$tmp;
print ${$array[0]};

仮に最後の行を$$array[0]と書いたとすると、[]の結合度が最低であるために、まず$array[0]の中身を見に行って欲しいのに、まず$arrayの中身を見に行きます。

3. 配列要素の参照

以下のように書きます。

use strict;
my %hash = ('a'=>1, 'b'=>222, 'c'=>3);
my $r = \($hash{'b'});
print $$r;

表示は222です。

4. いきなり無名配列を使う

以下のように書きます。

use strict;
my $r = [];
@$r = (1,2,3,4,5);
print $r->[0];

このへんが高級言語の凄さと言うか、勝手にメモリを確保してくれて超快適。2行目の=[]は不要ですが、$rが無名配列の参照であることを明示するために付けることが望ましいとされています。多次元は以下ようにします。

@{$r->[5]} = (6,7,8,9,10);
print $r->[5][1];

表示は7です。

5. でもやるな

Perlが最も苦手とする処理が添え字演算です。いわゆるforよりforeachが速いのはこのためです。以下のコードはforeachを使って1から100までの和を求める計算を一万回行います。コメントアウトしたforループバージョンよりも約50%高速です。

#! /usr/bin/env perl
#use strict;
use Benchmark;
my $t0 = new Benchmark;
for(0..10000) {
    &bench;
}
my $t1 = new Benchmark;
my $td = timediff($t1, $t0);
print "the code took:",timestr($td),"\n";

sub bench
{
    my @old = (1..100);
    my $new;
#    for(my $i=0; $i<=$#old; $i++) {
    foreach my $value(@old) {
        $new += $value;
    }
}

なるべく添え字を使わない処理が望ましいということです。先に紹介した処理は全て添え字を使っています。しいて言えば先に紹介した方法で書いた方がマシだけれども、最も良い方法は、pushなりpopなり文字列連結なりを駆使して、添え字を使わずに書くことです。

BlogMode speed member / 2008.03.02 21:08

These pages are designed for NN7 & IE6.
BBSWiki ver.1.50 Final blogmode.
Copyleft (!C) 2005-2007 SUICIDE BLONDE JP.
All Lefts Reserved.

Valid XHTML 1.0 Strict Valid CSS!