2008年12月7日日曜日

cshの限界について

配列を参照するのにforeach文というものがあります
これはperlとかphpにあったりします。そんでcshにもあるのですが・・・
なぜかcshのforeach文に指定できる配列数の上限は997なのです
この997配列がMAXというのはOSやハードウェアの仕様によらずに、どの環境でも同じでした。
つまりcshの言語仕様ってことらしい。なぜ??なんでだろーなんでだろー

いろいろなシェル(一部perlで検証してみた)
イナバの物置風にforeachの捌ける配列MAXを探す
※スクリプト中に使われるファイル(list.txt,list2.txt)は複数行あるテキストファイルです。このファイルに例えば3行あれば3個の配列を用意します(空行は除く)。
つまりcshが997が限界なのかを検証するには997行のファイルと998行のファイルを用意すればいいのです。


まずはbash 全然平気

#!/bin/bash
array=(`cat list.txt`)
for line in ${array[@]}
do
echo $line
done
echo "やっぱりbash ${#array[@]} 人のっても大丈夫"


続いてzsh まあbashの強化版だし平気みたい

#!/usr/bin/zsh
array=(`cat list.txt`)
for line in ${array[@]}
do
echo $line
done
echo "やっぱりzsh ${#array[@]} 人のっても大丈夫"


cshとは違うのだよcshとは みたいな感じで余裕でクリア

#!/bin/tcsh
set array=`cat list.txt`
foreach i ($array)
echo $i
end
echo "やっぱりtcsh ${#array} 人乗っても大丈夫"


流石perlだどんな配列でもなんとも無いぜ!

#!/usr/bin/perl
open (FH,"list.txt");
@array=<FH>;
foreach (@array) {
print;
}
print "やっぱりperl ",$#array+1,"人乗っても大丈夫\n";
close FH;


この入力ファイルが997行以上あると・・・・
ちょおまwwwwみたいな感じで駄目 csh終わったな・・・

#!/bin/csh
set array=`cat list2.txt`
foreach i ($array)
echo $i
end
echo "やっぱりcsh ${#array} 人乗っても大丈夫"

0 件のコメント: