perl 複数の配列や多次元配列をサブルーチンの引数にする場合

Perlでは正確には二次元配列は利用できない。
サブルーチンの引数は@_の単なる配列にまとめられちゃうので、
複数の配列や多次元配列を渡す時は参照渡しにする。

以下は、
123456abc
と出力したいわけだが、
hoge1ではうまくいかない。

#---------------------------------------------------------------
@array1 = (
[1,2,3],
[4,5,6],
);
@array2 = ('a','b','c');
#---------------------------------------------------------------
&hoge1(@array1,@array2);
sub hoge1 {
my @hoge1 = shift;
my @hoge2 = shift;

foreach $var1 (@hoge1) {
foreach $var1_2 (@{$var1}) {
print $var1_2;
}
}
foreach $var2 (@hoge2) {
print $var2;
}

}
#---------------------------------------------------------------
&hoge2(\@array1,\@array2);
sub hoge2 {
my $hoge1 = shift;
my $hoge2 = shift;

#デリファレンス
my @hoge1 = @{$hoge1};
my @hoge2 = @{$hoge2};

foreach $var1 (@hoge1) {
foreach $var1_2 (@{$var1}) {
print $var1_2;
}
}
foreach $var2 (@hoge2) {
print $var2;
}
}

perl 二次元・多次元配列の取り扱い

#久々にPerlさわったらすっかり忘れていたので・・・

----------------------- 配列 -------------------------------
■配列を静的に記述
@array = (
[4,5,6],
[1,2,3],
);
■4を出力
print $array[0][0];
■一次元目の要素数
print scalar(@array);
■二次元目の要素数
#$array[0]は配列のリファレンスなのでそれを解釈しなくてはならない
print scalar(@{$array[0]});
■ループ処理
foreach $var1 (@array) {
foreach $var2 (@{$var1}) {
print $var2;
}
}
for($i = 0; $i < scalar(@array); $i++) {
for($j = 0; $j < scalar(@{$array[$i]}); $j++) {
print $array[$i][$j];
}
}
■二次元目の3番目要素でソート
@array = sort { $a->[2] <=> $b->[2] } @array;
----------------------- 連想配列 ---------------------------
■連想配列を静的に記述
%array = (
'a0' => {
'a00' => 'hoge0',
'a01' => 'hoge1',
'a02' => 'hoge2',
},
'a1' => {
'a10' => 'hoge3',
'a11' => 'hoge4',
'a12' => 'hoge5',
},
);
■hoge0を出力
print $array{'a0'}{'a00'};
■ループ処理
foreach $key1 (keys(%array)) {
foreach $key2 (keys(%{$array{$key1}})) {
print $key2;
print $array{$key1}{$key2};
}
}

※keysやvaluesの戻り値はランダムになる

特定ディレクトリ以下の文字コード・改行コードを一括変更

find /path/to/dir -name “*.pl” | xargs nkf -e -Lu –overwrite

findで/path/to/dir以下の*.plを検索してパイプとxargsでnkfに渡す

xargs=標準入力からコマンドラインを作成し、それを実行する

nkfのオプション

-e はEUCへ変換
(-s SJIS)
(-j JIS)
(-w UTF-8)

-Lu UNIX改行コード(LF)へ変換
(-Lw Windows改行コード(CR+LF)へ変換)
(-Lm Macintosh改行コード(CR)へ変換)

–overwrite は対象ファイルを上書き

ディレクトリ以下のファイルパーミッションを一括変更

■拡張子(ファイル支持子)がcgiのファイルのみ変更
findで/path/to/dir以下の*.cgiを検索してパイプとxargsでchmodに渡す

[code]find /path/to/dir -name “*.cgi” | xargs chmod 755[/code]

■ディレクトリのみ変更
findでtype指定してからパイプとxargsでchmodに渡す

[code]find /path/to/dir -type d | xargs chmod 755[/code]

——————–
※ xargs=標準入力からコマンドラインを作成し、それを実行する
——————–