新規記事投稿 フォロー記事投稿 記事のキャンセル
From: 三葉工房の管理者 <nature-create@amy.hi-ho.ne.jp>
Subject: 不都合な配列の性格に阻まれて
Date: 1999/02/02 13:39:01

又,質問させていただく三葉工房です。

始めに,質問するには,どの位の間隔を置いて質問するのが望ましいのでしょうか。


 実は,例のBBSスクリプトの開発で,ユーザーパスワードを利用しての記事削除のプログラム
を作成していますが,配列の不都合な性格が災いして完成出来ません。

うちの機種はMACなので,MAC-PERLを利用しての,色々と配列の実行実験を行いましたが
完成に結び付く実行結果が出ませんでした。書きのが,その配列実験の簡易スクリプトです。

簡易スクリプト(配列の性質)

$frag=0;
$mart="muraei banner kojima sonic oacice colonbia kingdam hyogo serax kureeiji morisawa charenge
notenki tohoho goichi odakyu mailmg";
$mart="^$mart*";
$mart=~s/ /\'\,\'/g;
$mart=~s/\^/\(\'/g;
$mart=~s/\*/\'\)/g;
@mart=$mart;
$ggh=@mart;
@mart=@mart;
$nr=@mart;
$sd='mailmg';
@newmart=('muraei','banner','kojima','sonic','oacice','colonbia','kingdam','hyogo','serax','kureeiji','morisawa','charenge
notenki','tohoho','goichi','odakyu','mailmg');
$dfr=@newmart;

@fft=@newmart;
if($sd eq $mart)
{
$frag=$frag+1;}
$dhy=@fft;
if($frag==0)
{print "NO\n";}
else{print "YES\n";}
print "$dfrのはずが$gghの$nrの$dhy\n";
print "@mart\n";
=====================================================
というスクリプトで,@newmartの配列の内容は,例のBBSスクリプトの書き込みファイル
のパスワードをサーバー実行でブラウザにforeachで出力されたのを
出力された時は,値(パスワード名)と値の間が半角スペースでしたが
配列らしくするために,文字変換して('値','値')として,それを簡易スクリプトの
@newmartの配列の所にコピーしたと言う訳です。

 その結果,配列の不都合ん結果が出ました。
その不都合な結果とは,@newmartの場合は,スクリプトに配列の内容が生で記述されて
いるので,$dfr=@newmartと言う形で,$dfrの値は,しっかり配列の値の合計値の16と
出力され,その配列を更に@fft=@newmartと言う記述で@fftに代入して,$dhy=@fft;で
$dhyの値もそっくり配列の値の合計値の16と出力されました。
 ですが,一度もスクリプトに配列の内容が('値','値')と言う形で記述されてなく
$mart="muraei banner kojima sonic oacice colonbia kingdam hyogo serax kureeiji morisawa charenge
notenki tohoho goichi odakyu mailmg";
$mart="^$mart*";
$mart=~s/ /\'\,\'/g;
$mart=~s/\^/\(\'/g;
$mart=~s/\*/\'\)/g;
@mart=$mart;
という書き方の様に$martの変換前の状態を文字変換タグで配列の('値','値')に変換して,
変数のみで配列に代入するだけだと,$ggh=@martと言う形で配列の合計値を算出すると
値は1で,@mart=@mart,$nr=@martとしても$nrの値は1で,スクリプトの終わりの方の
print "$dfrのはずが$gghの$nrの$dhy\n"の出力結果は
16のはずが1の1の16
と出てしまいます。

書き込みファイルの内容をいちいち手書きで,配列構文で記述するのでは,
自動処理が特徴のCGIとしての意味を持ちません。

 そして,本題の実行スクリプトの話しに移ります。

上記の様に書き込みファイルのパスワードをforeachで出力させてみましたが

foreach $keymatch(@keymatch){
($mail,$yourname,$date,$gurl,$hpagename,$coment,$password)=split(/&&/, $keymatch);

if($in{'pawin'} eq $password){
$keyflag=$keyflag+1;
last;}}
だと,ファイルの最下段の記事のパスワード名(mailmg)しか出力せずに,そのパスワード
名の以外のパスワードは,一致しません。
詳しくは,BBSスクリプトの変更.削除で,パスワード入れてサブミットした,(パスワード
が一致しません)のページに,$passwordの内容を
foreach $keymatch(@keymatch){
($mail,$yourname,$date,$gurl,$hpagename,$coment,$password)=split(/&&/, $keymatch);

print "$password";



}でプリントアウトしています。foreachで直接プリントアウトすれば,$passwordで
全て出力されますが,それ以外の方法,例えば$passwordを@***に代入したりすると
@***は,(mailmg)しか出力しません。

その様に,ユーザーパスワードを利用しての削除.変更を行うには,どうしても
$in{'pawin'}($in{'pawin'}は,変更.削除のページのパスワードを入れる記入項目
から受け取った値)と$passwordの全ての値と一致させなければそれは出来ません。

どの様にすれば,$in{'pawin'}と$passwordの全ての値と一致される事が出来るのか
どうかアドバイス願います。
後,if((fg == hy)&&(gh<55))とif((fg =hy)の意味はどう言う意味なのでしょうか。
後,今回から参考のURLには,問題のBBSスクリプトの実行されないソース文が出力
されるページを代入しています。そして,スクリプトの実行されたページは


進性能掲示板
から入れます。

度々だすみませんが御忙しい中大変恐縮ですがどうか宜しくお願いします。