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);
}

[上に] [前に] [次に]