foreach文について

[上に] [前に] [次に]
クーポン拳 1999/08/26(木) 17:09:33
現在カウンターなどのスクリプトを読んで勉強しているのですが、
http://www.imjp.co.jp/~hong/counter/index.htmlに掲載されていたグラフィックカウンタのスクリプトで、わからない部分があるので教えてください。

質問@ 下記の("%0${keta}d",$access)の${keta}と$ketaは別物ですか?。書き方のルールの違いでしょうか。
質問A 下記の$k (0..($keta-1))で$kはどこからきたのか?
質問B (0..($keta-1))で(0..とはどういう意味か?

$keta="7";
$gif_url="../Img/"
$accessには1234が入っているとする。

$fwd = sprintf("%0${keta}d",$access);
foreach $k (0..($keta-1)){
  $moji=substr($fwd,$k,1);
  print "<IMG SRC=\"$gif_url/$moji.gif\">";
}
exit;

上記のことがよくわからないので教えてください。

葉月 1999/08/26(木) 17:50:22
まる1は、機種依存文字なのでやめましょう...

>質問1
$ketaと${keta}は、同じです。
"%0${keta}d"の場合、どこからどこまでがスカラー変数なのか認識させるため

>質問2
$kは、どこからも来てません。。。というより、(0..($keta-1))の値が
代入されます。なくても、下の$kを$_にすれば、大丈夫そうだけど。

>質問3
(0..($keta-1))は、0から$keta-1まで、1ずつ増加すること...

ふじ 1999/08/26(木) 22:38:50
補足。
>(0..($keta-1))は、0から$keta-1まで、1ずつ増加すること...
$nが数字の時、
(0..$n) は、(0,1,2,3, ... , int($n-1), int($n))という配列と等価です。

("A".."F")

("A", "B", "D", "E", "F")
と等価だったりもします。

ふじ 1999/08/27(金) 02:39:21
ありゃ、間違い(^^;
>("A", "B", "D", "E", "F")
("A", "B", "C", "D", "E", "F")
ですね。

#print ("a0" .. "e9");
#print ("a00" .. "e99");
#とかやってみると・・・Perlって面白いですねぇ(^^)

クーポン拳 1999/08/27(金) 09:45:19
葉月さんの
>まる1は、機種依存文字なのでやめましょう...
についてですが、大変失礼しました。
質問の続きですが
>$ketaと${keta}は、同じです。
>"%0${keta}d"の場合、どこからどこまでがスカラー変数なのか認識させるため
とありますが、書式にスカラー変数を使う場合、$変数名を${変数名}と書かなくてはならないというルールでしょうか?
教えてください。

たこすけ 1999/08/27(金) 10:50:07
ルールというか・・・
区切ってあげないと「$ketad」という
スカラー変数と勘違いしちゃうんじゃ?

例えば
$keta = "7";
$ketad = "hoge";
とかしてあったら
sprintf("%0$ketad",$access)は
sprintf("%07d",$access)とはならずに
sprintf("%0hoge",$access)になってしまう
・・・こういった話では?

なので別に
> $変数名を${変数名}と書かなくてはならない
という訳では無く
> どこからどこまでがスカラー変数なのか認識させるため
sprintf("%0".$keta."d",$access)
こう書いてもいいんじゃない?

# 全部想像で書いたので間違ってるかも・・・(^^;

クーポン拳 1999/08/27(金) 10:59:58
[[解決]]
葉月さん、ふじさん、たこすけさん、すごく解かりやすい説明、ありがとうございます。
勉強になりました。

葉月 1999/08/27(金) 11:04:25
>書式にスカラー変数を使う場合、$変数名を${変数名}と書かなくてはならないというルー
ルでしょうか?
ルールというか、そうすることができると解釈したほうがいいでしょうか...
変数と英数字が混同するときに、$のあとの{}内の文字は、$の添え字として使うことができます。

例えば、print "$nth";とした場合、$nthが変数として扱われますが、
ほんとは、$nが変数で、$nが4だった場合、4thと表示させたいときなど、
print "${n}th";とすれば、思っていることができます。

あと、便利な使い方として、連想配列などで下のようなこともできます。

例)あるゲームの個人別、月別の集計をする(必ずしも、いい例とは限りませんが...)
data.dat(データファイル:名前,月,得点の順)
open (IN, "data.dat");
while (<in>){
($name,$month,$score) = split(/\,/, $_);
$score_total{$name} += $score;
${$name}{$month} += $score;
}
close (IN);
@sanka_list = keys %scoretotal #参加者のリスト
print $sanka_list[0],"さんの8月の得点は、",${$sanka_list[0]}{'8'},"点です。";

#表示は、hogeさんの8月の得点は、120点です。みたいになるとおもいます。
#なんか、よけい混乱させたような気が...f(^_^)

葉月 1999/08/27(金) 11:06:54
あ、いつのまにか解決が...^-^;

クーポン拳 1999/08/27(金) 11:48:23
添え字がある場合は解決したんですが$_の場合は
#$fwd = sprintf("%0$_d",$access)
と書くことができるんでしょうか?
教えてください。

葉月 1999/08/27(金) 13:17:18
$_自体が特殊変数として、予約語になっているので、"%0$_d",$accessのままで
構わないと思います。
やってみれば、わかると思いますが...

クーポン拳 1999/08/27(金) 13:33:06
#$fwd = sprintf("%0$_d",$access)で大丈夫でした。
わからないところはこれで解決しました。
ありがとうございます。

たこすけ 1999/08/27(金) 14:01:12
> sprintf("%0$_d",$access)
ウチじゃ駄目でした。

$_d = "hoge";
print $_d;

とか出来ちゃうし・・・変なのかな?

クーポン拳 1999/08/27(金) 14:43:07
すみません。まちがえました。
よく見直したら、$kを$_になおしてました。

#$fwd = sprintf("%0$_d",$access)にしたら全然予定外の値が帰ってきました。
#$fwd = sprintf("%0${_}d",$access)にしたら求めていた値が帰ってきました。
ということで、添え字($のあとの文字)は{}で囲む。
補足: $_は${_}となる。
という結果でした。
どうもありがとうございました。

ふじ 1999/08/27(金) 15:01:01
>添え字($のあとの文字)
普通、添字というと配列の添字を指しますので・・・
#$array[$n];
#と表記した場合の $n のこと。

「$の後の文字」は、識別子、といいます。

>添え字がある場合は解決したんですが$_の場合は
ってのを見て、何を言っているんだろう?と混乱しちゃいました(^^;

クーポン拳 1999/08/27(金) 15:16:22
すみません。またまたまちがえました。間違えて覚えてしまいました。

>ということで、添え字($のあとの文字)は{}で囲む。

修正
ということで、識別子($のあとの文字)は{}で囲む。

どうもありがとうございました。

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