CGIでのリストの作り方は?…
[上に]
[前に]
[次に]
ATSUO
[E-Mail]
2000/02/26(土) 14:58:13
はじめまして。
perlで、リストを作ろうと思っているんですが、、
@aaaa = a..z;
としたら、aからzまでのリストができますよね?
aからzそして、大文字のAからZと、0から9までのリストを作りたんですが、
どうやったらできますか?
@aaaa = a..Z;
ってやっても
@aaaa = a..9;
ってやってもだめでした。
よろしくお願いします。
たこすけ
2000/02/26(土) 15:52:17
@list = (a..z,A..Z,0..9);
とすれば良いと思います。
Atsuo
2000/02/26(土) 16:10:43
@list = (a..z,A..Z,0..9);
ってしたら、
二桁にできないんですよ。
aa ab ..... Aa ....A0....99
みたいにしたいんです。
S-pore
[HomePage]
2000/02/26(土) 16:29:35
うーん,2桁って・・・どういうふうにしたいのかいまいち分からないのですが・・・(^^;
とりあえず,たとえば
foreach $a2(a..z, A..Z, 0..9)
{
foreach $a1(a..z, A..Z, 0..9)
{
push(@list, "$a2$a1");
}
}
とすれば,@listには2桁の62進数のリスト(62×62要素)ができます。
@list = ("aa", "ab", (中略), "98", "99"); と同じ。
S-pore
[HomePage]
2000/02/26(土) 16:31:05
ごめんなさい,ソースがぐちゃぐちゃになってしまいました。
foreach $a2(a..z, A..Z, 0..9)
{
foreach $a1(a..z, A..Z, 0..9)
{
push(@list, "$a2$a1");
}
}
です。
Atsuo
2000/02/26(土) 17:30:02
でもこうしたら、桁が増えるとめちゃ遅くなるんですよね…
S-pore
[HomePage]
2000/02/26(土) 18:01:48
そりゃそうです。(^^; 4桁の62進数のリストを作るなんてのはあまりにも非現実的ですね。
前にも書いたように,何がしたいのかよくわからないので
的確な答えも書けないです。(って分からないのは私だけ?)
1. 62進数の文字列を10進数に変換したい
2. 1.の逆
3. 1.でも2.でもない
のどれでしょうか?
とりあえず1.で書いておきますね。(^^;
# 下準備
$i = 0;
foreach (a..z, A..Z, 0..9)
{ $table{$_} = $i++; }
# 62進数文字列
$str = 'aB2';
# $strを10進数に変換して$valueに入れる
$value = 0;
foreach (split(//, $str))
{ $value = $value * 62 + $table{$_}; }
ハッシュを使ったのに特に意味はないです。一番Perlらしいやり方ということで。(独断)
indexを使っても,文字コードを元に計算してもいいでしょう。
(しかし達人さんがやると置換表現とか1行で済ませてしまいそうなのがPerlの奥深いところですね。^^)
さだぼう
2000/02/27(日) 12:59:04
62進数の文字列を10進数に変換したいなら,
サブルーチンにすればこんな感じ
(方法は他にもありそう,ただposを使いたかっただけ).
#aが0で0が52というのはわかりにくいので,
#0-61が 0-9,a-z,A-Z に対応するようにしてあります
sub conv62to10($) {
local $temp=join('',(0..9,a..z,A..Z));
local $value;
foreach (split(//, $_[0])){
$value = $value*62 + (-1+pos $temp) while $temp =~ m/$_/g;
}
}
さだぼう
2000/02/27(日) 13:06:22
↑訂正(^^;
sub conv62to10($) {
local $temp=join('',(0..9,a..z,A..Z));
local $value;
foreach (split(//, $_[0])){
$value = $value*62 + (-1+pos $temp) while $temp =~ m/$_/g;
}
return($value);
}
さだぼう
2000/02/27(日) 13:15:39
index関数を使うとこんな感じ:
sub conv62to10($) {
local $temp=join('',(0..9,a..z,A..Z));
local $value;
foreach (split(//, $_[0])){$value=62*$value+index($temp,$_)}
return ($value);
}
[上に]
[前に]
[次に]