新規記事投稿 フォロー記事投稿 記事のキャンセル
From: 三葉工房の管理者 <nature-create@amy.hi-ho.ne.jp>
Subject: Re: 不都合な配列の性格に阻まれて(回答します。)
Date: 1999/02/08 12:40:46
Reference: mesh.program/00607

三葉工房です。既に5日前の投稿ですが,YASU様の御質問にお答えします。
A.に続く文章が回答です。

色々と,本当の礼儀の大切さについていい勉強になりました。
どうもありがとうございました。



>>簡易スクリプト(配列の性質)
>
>martとかgghとかsdとかdfrとかは何か意味のある単語や略語なんでしょうか。
>何のための変数なのか、もっと分かりやすい名前を付けたほうが読みやすいし、
>保守やデバッグが楽じゃないかと思うのですが…。

A.これは,MacParl上のテスト用で,適当にmartとかgghとかの名前を付けただけです。

>>print "$dfrのはずが$gghの$nrの$dhy\n";
>
>というのをぱっと見て、どういう情報を出力しようとしているのか分かりますか?

A.適当な称号を使っているので,自分か,若くは,よほど簡単なプログラムでなければ
分からないと思います。

>それと、ブロック("{" と "}" で囲まれた部分)などは
>
>  sub hoge {
>    if ($foo == $bar) {
>      &amp;baz(q{I said, "You said, 'She said it.'"});
>    }
>    else {
>      &amp;zot('abc', 'def', 'xyz',
>               $something[$foo + $bar] / $anythong{$qux . $quux});
>    }
>    
>    @sorted_array = sort { $a &lt;=&gt; $b } @array if $todo{'sort'};
>  }
>
>のように字下げして書くことを<STRONG>強く</STRONG>お勧めします。ブロックの中を全く字下げ
>していないと、プログラムの制御構造の流れが追いにくく、とても読みにくいです。
>
># 少なくとも、前に投稿された例えば「<A href="00580.html">徹底的な…</A>」などのスクリプトを
># 目にしたときは、ぱっと見ではどこからどこまでがひとつのサブルーチン
># なのかすらさっぱり分からず(今でもあまり把握していませんが)、読む気も
># しませんでした

A.そうですね。プログラムは,分かり易く書くべきと思います。だんだん,プログラミングに
慣れるに従ってメチャクチャになりましたので。

>
>ラクダ本の第2版(背表紙の青いほう)をお持ちなら、いちど「8.4 プログラミングの
>書法」(pp.626-)あたりに目を通してみてください。
>初版(背表紙の赤いほう)にも同じような内容があったはずですが、いま手許に
>無いので何処に載っていたかはわかりません。

A.プログラミングの書き方の基礎が記述されていました。

$dfr=@newmartと言う形で,$dfrの値は,しっかり配列の値の合計値の16と
>>出力され,その配列を更に@fft=@newmartと言う記述で@fftに代入して,$dhy=@fft;で
>
>16は「配列の値の合計値」ではなく、単に配列の要素の数ですね。
>
># 三葉工房の管理者さんにとってはそういう意味なのかも知れませんが、
># 少なくともプログラミング上の一般的な用語としては、両者は違うものを
># 意味します
>
># ちなみに、何故「17」ではなく「16」なのか理解してます?

A.配列は,C Languageと同じく0から数えるから。17は,$arrycnt=@arryと言う
形の配列の値の合計値を数えている。

>>という書き方の様に$martの変換前の状態を文字変換タグで配列の('値','値')に変換して,
>>変数のみで配列に代入するだけだと,$ggh=@martと言う形で配列の合計値を算出すると
>>値は1で,@mart=@mart,$nr=@martとしても$nrの値は1で,スクリプトの終わりの方の
>
>いくら文字列としてリスト(配列)に見えるように加工しても、依然として
>それは単なる文字列にすぎないからです。
>
># @array = $scalar という式が一体どういうことをやっているのか、
># よ〜く考えてみてください
>
>#   @array = (123, 456, 789);
>#   $scalar = @array;
>#   @array = $scalar;
>#   $scalar = @array;
># とすると @array と $scalar の内容はそれぞれどうなるのか、それは何故なのか、
># よ〜く考えてみてください

A.上記の
>同様に、$scalar = @array;をMacperlで実行してみました。
@arrayを$scalarへの1回目の代入は,@arrayの配列が記述されていますので,
3が返ります。
しかし,更に@arrayの入った$scalarから更に配列へ代入すれば,それは,単なる
1要素に過ぎないとみなされますので,@arrayを$scalarへの2週目の代入で値は
1が返ります。

>
>  $program = "print 1 + 2;\n";
>  $program;
>  print $program;
>
>は、3 とは表示せずに print 1 + 2; とだけ表示します。「プログラムっぽく
>見えるもの」は、必ずしも「プログラム」ではありません。
>
># しかし、eval($program); は 3 と表示します
># 何故なのかはマニュアルや本やWebをどうぞ

A.MacPerlで実行してみたら3が返ってきました。$evalは,プログラムの要素と要素
の計算をする関数らしいですが,駱駝本を読んだらやや初心者には,難解な解説が
書かれていました。ちなみに,駱駝本の他に購入したperl本は,技術評論社の
「CGIのための実践入門perl」ですが。

>では、どうやって文字列を配列に変換すればいいかは、いしどうさんの<A href="00605.html">投稿</A>を
>参照してください(そしてマニュアルや本やWebを探してください)。
>
>>foreach $keymatch(@keymatch){
>>($mail,$yourname,$date,$gurl,$hpagename,$coment,$password)=split(/&amp;&amp;/, $keymatch);
>>
>>if($in{'pawin'} eq $password){
>>$keyflag=$keyflag+1;
>>last;}}
>>だと,ファイルの最下段の記事のパスワード名(mailmg)しか出力せずに,そのパスワード
>>名の以外のパスワードは,一致しません。
>
># これだけだと、例えば @keymatch に何が入っているのか、もとのスクリプトを
># 読まなければ分かりません。必要に応じてそれなりに説明を加えてください
>
>「出力」というのは、何がどう「出力」されるのですか?
>引用された部分には「パスワード名」の「出力」と呼べるような処理は含まれて
>いないようですが。
>
>$keyflagの値が増えていたら「出力」されたことになるということでしょうか。
>
>>}でプリントアウトしています。foreachで直接プリントアウトすれば,$passwordで
>>全て出力されますが,それ以外の方法,例えば$passwordを@***に代入したりすると
>>@***は,(mailmg)しか出力しません。
>
>どういうふうに「代入」したのですか?



>  @array = $password;
>
>なら、最終的に @array に入っているのは当然ひとつの要素だけでしょう。
>代わりにpushなどを使ってください。詳細はマニュアルや本やWebを見てくださいね。
>
>>その様に,ユーザーパスワードを利用しての削除.変更を行うには,どうしても
>>$in{'pawin'}($in{'pawin'}は,変更.削除のページのパスワードを入れる記入項目
>>から受け取った値)と$passwordの全ての値と一致させなければそれは出来ません。
>
>何故?
>$passwordの値は @keymatch の各要素(つまりはファイルの各行)に応じて変化
>するのではないのですか?
>
>もしかしたら「一致」とは「比較」のことかも知れませんが、「全ての値」との
>「比較」は(foreachループを使って)なされていますよね…。
>
># そもそも、目的の記事を「パスワード」をキーにして探すという仕様自体が
># とても不自然に感じるのですが…

A.上記の質問は,黒幕的存在という記事で答えました。本来は
foreach $keymatch(@keymatch){
($mail,$yourname,$date,$gurl,$hpagename,$coment,$password)=split(/&amp;&amp;/, $keymatch);

if($in{'pawin'} eq $password)
{
$keyflag=$keyflag+1;
last;}
			}
で全ての$password)にマッチしますが,mailmgを除いてのパスワードに改行文字が付加
されていて,一致せずにそのような結果になりました。$keyfragは,パスワードが
マッチすれば,1たされ,削除or変更の対象記事が出力されます。
 ですから,$passwordの値は @keymatch の各要素(つまりはファイルの各行)に応じて
変化します。


>
>質問というものは、他人が読んで理解できるように書かなければ、誰も答える
>ことができません。三葉工房の管理者さんに限ったことではありませんが、
>
>  「<EM>答えてもらいやすい質問をしてください。</EM>」
>
>質問記事の読みやすさは、プログラムの読みやすさより数倍重要です:-)

A.その様に次回から心がけます。(これだけ無作法な行為をして投稿する資格は
あるはずないのですが。)


後,余談なのでずか,もし手が空いていたら教えて下さい。本来とは,関係の
ない質問もございますが,関心がありますので,失礼な事聞いて済みません。
1.YASU様は,perlを始めて何年になりますか。
2.perlのプログラミングで一番つまづいた経験はなんですか。
3.回答者の方々は,ふだんは,どんな事をしているのですか。そして,
TAD様とかにあ様と石堂様とかはかお知り合いですか。
にあ様と石堂様は,文章から見て女性の方だと思いますが。