CGI-BBS > SO−HO > ショッピングバスケット > SB Ver6.9について商品を[削除する]仕組みを解説して欲しい。


カレッヂ
カレッヂ


質問者 k_taro  投稿日 2/14(金) 10:27:18
ここでの質問が適切でないかもしれませんが、教えていただければ幸いです。

コードで削除に関係あるカ所は何ヶ所かありますが、
以下のコードでどうしてそうなるかわかりません。
教えてください。

sub mado_1 の始めの方で

	if (open(ORDER,"$tmp$COOKIE{'CART'}\.bk6")) { 		#かごの中身を読みこむ
		while (<ORDER>) {
			s/\n//g;
			if (/^#|^$/) { next;}
			if (/^\*(\d+)/) {
				$DELETED{$1} = 1;  #1 
				$del ++;
			}else {
				push(@CARGO,$_);						
			}
		}
   	 close(ORDER);
	}

中ほどで
		foreach (@CARGO) {
			($code, $name, $fee) = split(/\t/, $_,3);
			if ($DELETED{$code}) {next;}      #2
			$SHOKEI += $fee; 										# 累計
			($fee,$fee2) = &comma($fee);

とありますが、
#1で $_ にフラグをつけている?
#2で $_ のフラグを認識している?
がどうも理解できません。どなたかか解説してください。

プロバイダ参照:
サーバのOS:UNIXサーバ
パソコンのOS:Mac9
エディタ:Jedit
FTPソフト:Fetch3.0.3J1
サーバ移転:していない
改造:している 改造前正常動作
CGI習熟度:middle

回答者 呑兵衛@大阪  [削除]  投稿日 2/14(金) 19:47:06
日本語風に書くと
if (/^\*(\d+)/) { $DELETED{$1} = 1;
#1 買い物履歴の一行に 行頭が*続いて数値の1つ以上の連続($date_num)があれば
#  ハッシュ変数DELETEに、キー{$date_num}、値に 1 という要素を作る
foreach (@CARGO) {
#  リストCARGO を一行ずつ読み出し
($code, $name, $fee) = split(/\t/, $_,3);
#  一行の各要素を $code $name $fee にそれぞれ代入
if ($DELETED{$code}) {next;}
#2 代入作業中、ハッシュ変数DELETEにもキー{$code} を代入し、キー{$date_num}、値に 1 という要素と
#  一致($codeに#1の$date_numが該当)すれば無視して次の作業
質問者 k_taro  [削除]  投稿日 2/16(日) 10:55:17
呑兵衛@大阪 様
回答有り難うございます。

ハッシュのこのような使い方が出来ることを初めて知りました。

		foreach (@CARGO) {
			($code, $name, $fee) = split(/\t/, $_,3);
			if ($DELETED{$code}) {next;} 
で 
 ($code, $name, $fee)の$codeと$DELETED{$code}の$codeを比較参照している?
ところが、自然なのでしょうが、なんか不思議な気もします。
 
たとえば
sub mado_1 の始めの方で

			if (/^\*(\d+)/) {
  $delNum=$1;
				#$DELETED{$1} = 1;  #1 この部分を上の行に書換えて
				$del ++;

中ほどで
		foreach (@CARGO) {
			($code, $name, $fee) = split(/\t/, $_,3);
  if($_=~/$delNum/) { next; }
			#if ($DELETED{$code}) {next;}      #2 この部分を上の行に書換える。

 #1 #2の部分を書換えても同じかと思ったが結果だめでした。
 違いが分かりません。
回答者 呑兵衛@大阪  [削除]  投稿日 2/16(日) 17:17:57
> $delNum=$1;
削除される項目は1つとは限らない。2つ以上になると $delNum は上書きされる。
だからハッシュ処理されています。
質問者 k_taro  [削除]  投稿日 2/16(日) 17:35:31
呑兵衛@大阪 様
またまた回答有り難うございます。

やっとハッシュでフラグ処理している意味が分かりました。
有り難うございます。

このページは終了したので返信(回答)は書きこめません
 


Web裏技