Perl

CGI で使うスクリプト言語です。洗練されてますけど、多少勝手が違うので悩みます。
更新日 2016-02-13

Tip's

#2 リファレンスについて (Perl)

Perl5 から導入。ハッシュの中に配列を突っ込んだり、配列の中にハッシュを突っ込んだりできます。変数の前に \ をつければリファレンスが得られ、 リファレンス変数の前に変数を取り出す記号 ($, @, %) をつければリファレンスの中身が得られます。
$ref = \$val;   # $ref にスカラ値へのリファレンスを入れる
$ref = \@array; # $ref に配列へのリファレンスを入れる
$ref = \%hash;  # $ref にハッシュへのリファレンスを入れる

$val = $$ref;   # $ref からスカラ値を取り出す
@array = @$ref; # $ref から配列を取り出す
%hash = %$ref;  # $ref からハッシュを取り出す

$val = $array_ref[0];
$val = $hash_ref{'name'};
配列の0番目の要素を取り出すって時は @array[0] じやなくて $array[0] で、リファレンス風に読めば array の0番目をスカラ値として 取り出すって感じですもんね。といか、配列の要素が $ である理由が、リファレンスやってやっとこさ分かりました。こういう理由 だったんですね。

ハッシュの中にハッシュ

作成もアクセスも簡単ですが、each() で返る値(参照)は実体を指すように(キャスト)しないといけません。
(saample)文字列を分割して配列に入れます。文字をキーとしたハッシュを作成し、同じ文字が出現したらカウンタを上げます。
#!/usr/bin/perl

# $str文字列を分割して配列に入れます。文字をキーとしたハッシュを作成し、
# 同じ文字が出現したらカウンタを上げます。

$str = "abjihdkgincksbetqoplomvubzmnnbvxuwytrfhasiqplapsljfuenrybcibnxjalke";
%hashName = ();
{
	for (my $nPos = 0; $nPos < length($str); $nPos++)
	{
		$tmp = substr($str, $nPos, 1);	

		if (!($hashName{$tmp}))
		{
			$hashName{$tmp} = { 'count'=>1 };	# new hash
		}

		$hashName{$tmp}{'count'}++;
	}
}

while (($name, $value) = each(%hashName)) 
{
	%ref = %$value;
	print ("$name = $ref{'count'}, ");
}

exit;

フォルダ一覧(再帰)

なぜか親フォルダをopen したままだと上手く動かない。
#!/usr/bin/perl

@listFile = &getFolder(".");

foreach $tmp (@listFile)
{
	print ("$tmp,\n");
}

exit;

sub getFolder()
{
	my $dirname = $_[0];

	my @listFile = ();
	my @listFolder = ();

	{
		opendir(DIR, $dirname);
		{
			while (defined(my $dir = readdir(DIR)))
			{
				if (!($dir eq "." or $dir eq ".."))
				{
					my $dirTmp = $dirname."/".$dir;

					my $type = -d "$dirTmp" ? "D" : "F";
					if ($type eq "F")
					{
						push(@listFile, substr($dirTmp, 1));
					}
					else
					{
						push(@listFolder, $dirTmp);
					}
				}
			}
		}
		closedir(DIR);
	}

	{
		foreach $tmp (@listFolder)
		{
			push(@listFile, &getFolder( $tmp ));		
		}
	}

	return (@listFile);
}

Perlモジュール

cgi-bin.pl は汎用ライブラリです。@INC はライブラリの検索パスらしい。
push(@INC, './lib');
require 'cgi-lib.pl';

print &PrintHeader();