CGI-BBS > CGI > Perl > foreach関数で処理結果が違うのはなぜ


カレッヂ
カレッヂ


質問者 やまあらし  投稿日 5/11(土) 15:18:59
下記CGIを実行したときに data.datに1,2,3,4,5,6と言う
データーがあるとした場合

@listの方は
123456は と出ます

@sublistの方は
1は2は3は4は5は6は と出ます

私は両方とも 1は2は・・・と表示されると
思うのですがなぜ結果が違うのでしょうか

print '@list'; としたら、きちんと
1,2,3,4,5,6 と出るのに
結果が違う・・・なぜ?

理解しておきたいのでどなたか教えていただければと思います。
よろしくお願いします。
以下 プログラムになります


#!/usr/local/bin/perl
print "Content-type: text/html\n\n";

if(!open A,"data.dat"){
print "データファイルを開けません。<hr size=1>";
exit;
}
@list=<A>;
close(A);

&hyouji;

@sublist=(1,2,3,4,5,6);

&hyoujini;

sub hyouji{
foreach $value ( @list ){
print "$valueは ";
}
}

sub hyoujini{
foreach $value ( @sublist ){
print "$valueは ";
}
}

exit;
回答者 しあわせのツボ  [削除]  投稿日 5/11(土) 17:53:45
data.datにはどのような形で記録していますか。
例示のスクリプトの場合、\n毎に1ループでforeachが回ります。
手元マシンとサーバマシンのOSによって改行コードが異なるので注意が必要です。
質問者 やまあらし  [削除]  投稿日 5/11(土) 23:06:13
いつもいつもありがとうございます。
どのような形???
えーとですね 一番最初はワードパットで
1,2,3,4,5,6
6,5,4,3,2,1 実際は半角英数です
と言った感じで1件分1行のCSVを作ってアップしています(アスキーで)
その後TXTファイルをdatに変更しています。
あとは、CGIで上書き、書き足しします。
datファイルを開くと1件分1行になっています。

サーバーOSはリニックスとアパッチとか言っていました
NT系ではないとのことです。
私は98SEを愛用しております。

???な事が多くちょっと分かりませんが
どうしたら(どう理解したら)プログラミングに役立つでしょうか
回答者 今夜はやすだ  [削除]  投稿日 5/11(土) 23:45:25
つぼさんのいったことに付け加えてファイルから読み込んだデータを対象しているhyouji関数内をかえると、
for(@list){
        for(split',',$_){
                print"$_は";
        }
}
ですね。
質問者 やまあらし  [削除]  投稿日 5/12(日) 01:53:51
ありがとうございます。
2つの事から おぼろげに分かってきました

同じコンマ区切りの形式でも

CGIでファイルを読み込んだものと
CGIの中で作ったものとで

処理の仕方が違う と言うことなのでしょうか
ファイルから読み込んだものは スプリットして
やっと CGIの中で作ったものと同じになると言うことで
よろしいのでしょうか

違っていたら ご指摘下さい。
回答者 しあわせのツボ  [削除]  投稿日 5/12(日) 03:18:57
@list = (1,2,3,4,5,6);
はカンマ区切りデータではありません。

Perl内で
@list = (1,2,3,4,5,6);
とすると、
$list[0] は 1
$list[1] は 2
$list[2] は 3
(以下$list[5]まで続く)
になります。
対して、ファイル内に
1,2,3,4,5,6
6,5,4,3,2,1
と書いたものをファイルハンドルから読み込むと
$list[0] は 1,2,3,4,5,6
$list[0] は 6,5,4,3,2,1
(以下は存在しない)
になります。

もし、ファイルハンドルから読み込んで前者と同じようにしたければ、
ファイル内に
1
2
3
4
5
6
のように記録しておくか、
読み込んだデータをsplitして改めて配列にする必要があります。
質問者 やまあらし  [削除]  投稿日 5/13(月) 02:37:42
皆様の意見を基に実験しました

できました 並びに 理解できました
データーを処理する上ですごく大事な理解点だと思いました。

最近ほんのちょっとですが 頭柔らかくなってきたような気がします

ありがとうございます。

まもなく目標とするものができあがりそうです。
でもまだ 難問ありそうです・・・。
がんばります!!

返信(回答)する


Web裏技