青島のしま〜Blue Islands〜


Perl Tips

リスト(配列)の要素数を得る

@array = (1,2,3);
$elemNum = @array;
print $elemNum;

Apache2 for Windows にmod_perlをインストール

$ cd c:/perl/bin
↑※これが重要(他の場所だとエラーになる)
$ ppm.bat install 'http://theoryx5.uwinnipeg.ca/ppms/mod_perl.ppd'
↑※Apacheの場所を聞かれるので,入力する.
  このときにProgram Filesなどと空白があるフォルダだと,エラーになる..
そして,conf/httpd.confに
LoadModule perl_module modules/mod_perl.so
を追加.
また,startup.plに
use Apache2();
を追加.

サブルーチン(関数)のプロトタイプ宣言を使う

サブルーチンを定義するときに,
サブルーチン名の後に丸括弧をつけて,
その中に$(ダラー)や@(アットマーク)を書くことで, 引数として何を受け取るかを明示的に指定することができます.
#ただし,確実にインタプリタが文法チェックをやってくれるわけではない?(よくわかりません)

スカラ変数を2つ受け取るサブルーチン

sub hoge($$)
{
    my ($param1, $param2) = @_;
}

配列を2つ受け取るサブルーチン

※配列の場合\ (バックスラッシュ)をつけないと,最初の配列にまとめられてしまうらしい
sub hoge(\@\@)
{
    my (@param1, $param2) = @_;
}

このサイトに説明が詳しく書いてあります.
http://www.rfs.co.jp/sitebuilder/perl/02/07.html

「$$変数」は,変数のリファレンス変数

「$$変数」は,C言語で言うポインタと同じ原理で用います.
$hoge = 123;      # 普通の変数
$pHoge = \$hoge;  # 変数への参照アドレスをもつ変数
print "$$pHoge\n";# 参照している変数の中身を表示
これをC言語で書くと,
int hoge = 123;         // 普通の変数
int *pHoge = &aa;       // 変数への参照アドレスをもつ変数
printf("%d\n", *pHoge); // 参照している変数の中身を表示
となります.

「@$hoge」は,配列のリファレンス変数

「@$hoge」は,配列のリファレンス(Cでいうポインタ)を扱うときに使います.

補足(['hoge', 'hoge2', 'hoge3']は,配列のリファレンス)

次のような,ブラケットで囲まれたリストは,配列のポインタを返します.
$hoge = ['a', 'b', 'c'];
つまり,次のコードと同じです.
@array = ('a', 'b', 'c');
$hoge = \@array;

実際にどうなっているかは,次のコードを実行してみれば分かると思います

@array = ('a', 'b', 'c', 'd', 'e');
$pArray = \@array;
print $pArray->[1] . "\n"; # 参照している配列の1番目の中身
print $pArray . "\n";      # 参照している配列のアドレス
print @$pArray . "\n";     # 参照している配列の要素数

$pArray2 = ['hoge', 'hoge2'];
print $pArray2->[1] . "\n";# 参照している配列の1番目の中身
print $pArray2 . "\n";     # 参照している配列のアドレス
print @$pArray2 . "\n";    # 参照している配列の要素数
push (@$pArray2, 'hoge3'); # 参照している配列の最後(2番目(0から数えて))に追加
print $pArray2->[2] . "\n";# 参照している配列の2番目を表示
実行結果は以下のとおり
$ perl -w hoge.pl
b
ARRAY(0x17242f8)
5
hoge2
ARRAY(0x275008)
2
hoge3


作成日: 2005年12月21日15時03日22秒
更新履歴
2008年07月22日 2008年02月08日 2008年02月06日 2008年02月05日 2007年10月25日 2006年12月20日 2006年12月19日 2006年12月05日 2006年09月20日 2006年06月18日 2006年06月12日 2006年04月22日 2006年03月30日 2006年02月28日 2006年02月23日 2006年02月18日 2006年01月13日 2005年12月21日