if文中で配列変数って使用できるのでしょうか?
やりたいことは、
フォームを使って入力されたデータと、ログファイルの中身を1行ずつ比べて、
同じものがあったら、そこで比較を終了させる、というようなことをやりたいのです。
たとえでこんな感じでif文つくりました。(これもあってるかどうか微妙なのですが。)
for($i=0; $i<5){
@FILELOG2 = split(/&/,$FILELOG[$i]);
if (@FILELOG2 eq @log){
print "ok\n";
}else{
print "ng\n";
}
exit;
}
フォームを使って入力されたデータは、
read(STDIN,$buffer,$ENV{'content_length'});
$buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
@log =split(/&/,$buffer);
のような感じで処理してあります。
ログファイルは
#ログファイルをオープン。
open FILE,"<02.log";
flock(FILE,2);
@FILELOG=<FILE>;
flock(FILE,8);
close FILE;
のようにしてあります。
おわかりの方、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
#1です。
>FILELOG2の前の#は何を意味するものなのでしょうか?
$#FILELOG2は、@FILELOG2の最後の添え字を返します。
例えば@FILELOG2の要素数が3だった場合は、2を返します。
>合っているところまでそれぞれの値を表示し、止まるのですが、
>「あってるよ」が表示されません。
>なぜでしょうか?
横レスで申し訳ありませんが、ログファイルの方には改行が含まれていませんか?
例えば $SYOZOKU1 が "所属" $SYOZOKU2 が "所属\n"の場合、表示すると一見同じに見えますが改行が入っているので
if ($SYOZOKU1 eq $SYOZOKU2)
はヒットしません。
$SYOZOKU2の改行をあらかじめ取っておくなりすれば良いと思いますよ。
回答ありがとうございます。
>$#FILELOG2は、@FILELOG2の最後の添え字を返します。
ありがとうございます、理解できました。
>$SYOZOKU2の改行をあらかじめ取っておくなりすれば良いと思いますよ。
@FILELOG2 = split(/&/,$FILELOG[$i]);
@FILELOG2 = ~ s/\n//g;
のようにしてみましたが、やはりダメでした。
改行をとるというのはこういうことではないのでしょうか?
よろしくお願いします。
No.4
- 回答日時:
#1、#3です。
@FILELOG2 = ~ s/\n//g;
ではなくて、
for文の中で
$FILELOG[$i] =~ s/\n$//;
@FILELOG2 = split(/&/,$FILELOG[$i]);
として下さい。
\n$ の "$" は正規表現で文末を意味します。
この場合、文末の\nだけを削除します。
この回答への補足
また教えていただきたいのですが、
print "Content-type:text/html\n\n";
$flag = 0;
for($i=0;$i<$#FILELOG && $flag==0;$i++){
$FILELOG[$i] =~ s/\n$//;
@FILELOG2 = split(/&/,$FILELOG[$i]);
($BANGOU2,$NAME2,$SYOZOKU2) = split(/&/,$FILELOG[$i]);
($BANGOU2TITLE,$BANGOU2) = split(/=/,$BANGOU2);
($NAME2TITLE,$NAME2) = split(/=/,$NAME2);
($SYOZOKU2TITLE,$SYOZOKU2) = split(/=/,$SYOZOKU2);
print "$flag$flag<BR>\n";
print "$i$i<BR>\n";
print "BANGOU1は「$BANGOU1」<BR>\n";
print "NAME2は「$NAME1」<BR>\n";
print "SYOZOKU1は「$SYOZOKU1」<BR>\n";
print "<BR>\n";
print "BANGOU2は「$BANGOU2」<BR>\n";
print "NAME2は「$NAME2」<BR>\n";
print "SYOZOKU2は「$SYOZOKU2」<BR>\n";
print "<BR><HR>\n";
if($BANGOU1 eq $BANGOU2 && $NAME1 eq $NAME2 && $SYOZOKU1 eq $SYOZOKU2){
print "あってるよ\n";
}
#終わらせたい時は $flag を 1 にする
}
としていますが、ログファイルの2行目まで(iが1まで)しか動作しません。
なぜでしょうか?
回答ありがとうございます。
文末には「$」を使うんですね。
知りませんでした。
無事「あってるよ」が出力されました。
ありがとうございました。
No.2
- 回答日時:
> if (@FILELOG2 eq @log){
↑これだと、両方の配列の数が同じだったらtrueが返ります。
if文で配列丸ごとゴッソリ
「中身がまったく同じだったら」という一発比較は、
どの言語であっても出来ないと思いますよ。
($a,$b,$c) = split(/&/,$FILELOG[$i]);
と、変数に格納してから
if($a eq $log[0] && $b eq $log[1] && $c eq $log[2]){
print "OK";
}
とした方がいいです。
> そこで比較を終了させる
をやりたい場合は、
$flag = 0;
for($i=0;$i<$#FILELOG && $flag==0;$i++){
#終わらせたい時は $flag を 1 にする
}
として、$flagが0の間だけfor回しを行う、
という風にしたらいいのではないでしょうか。
回答ありがとうございます。
ご指摘とおり、こんな感じにしてみました。
#フォームで送られてきたデータを分割 ($BANGOU1・$NAME1・$SYOZOKU1)
($BANGOU1,$NAME1,$SYOZOKU1) =split(/&/,$buffer);
($NAKAMITITLE,$BANGOU1TITLE,$BANGOU1) = split(/=/,$BANGOU1);
($NAME1TITLE,$NAME1) = split(/=/,$NAME1);
($SYOZOKU1TITLE,$SYOZOKU1) = split(/=/,$SYOZOKU1);
#ログファイルを分割 ($BANGOU2・$NAME2・$SYOZOKU2)
($BANGOU2,$NAME2,$SYOZOKU2) = split(/&/,$FILELOG[$i]);
($BANGOU2TITLE,$BANGOU2) = split(/=/,$BANGOU2);
($NAME2TITLE,$NAME2) = split(/=/,$NAME2);
($SYOZOKU2TITLE,$SYOZOKU2) = split(/=/,$SYOZOKU2);
それをfor文でループさせる。
print "Content-type:text/html\n\n";
$flag = 0;
for($i=0;$i<$#FILELOG && $flag==0;$i++){
@FILELOG2 = split(/&/,$FILELOG[$i]);
($BANGOU2,$NAME2,$SYOZOKU2) = split(/&/,$FILELOG[$i]);
($BANGOU2TITLE,$BANGOU2) = split(/=/,$BANGOU2);
($NAME2TITLE,$NAME2) = split(/=/,$NAME2);
($SYOZOKU2TITLE,$SYOZOKU2) = split(/=/,$SYOZOKU2);
print "$BANGOU1<BR>\n";
print "$NAME1<BR>\n";
print "$SYOZOKU1<BR>\n";
print "<BR>\n";
print "$BANGOU2<BR>\n";
print "$NAME2<BR>\n";
print "$SYOZOKU2<BR>\n";
if($BANGOU1 eq $BANGOU2 && $NAME1 eq $NAME2 && $SYOZOKU1 eq $SYOZOKU2){
print "あってるよ\n";
}
#終わらせたい時は $flag を 1 にする
}
としてみました。
合っているところまでそれぞれの値を表示し、止まるのですが、
「あってるよ」が表示されません。
なぜでしょうか?
よろしくお願いします。
No.1
- 回答日時:
>if (@FILELOG2 eq @log)
このif文だと、KODAMARさんの期待通りの動作はしません。
この場合、@FILELOG2と@logの要素数を比較し、同じ数であればtrueを返します。
>フォームを使って入力されたデータと、ログファイルの中身を1行ずつ比べて、
>同じものがあったら、そこで比較を終了させる、というようなことをやりたいのです。
であれば、
for ($i=0; $i<=$#FILELOG2; $i++)
{
if ($FILELOG2[$i] eq $log[$i])
{
print "OK";
}
else
{
print "NG";
}
}
と、素直にループを回した方が良いですよ。
回答ありがとうございます。
このままコピーして貼り付けてみたのですが、エラーが返ってきてしまいました。
なぜでしょうか・・・?
>for ($i=0; $i<=$#FILELOG2; $i++)
FILELOG2の前の#は何を意味するものなのでしょうか?
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- Perl perlのflock関数でロックをかけたままopen関数で何度もファイルを開きなおすことはできますか 3 2023/05/01 22:25
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA メール作成について ...
-
Line Inputにて改行があっても...
-
データの中に入る変な記号が分...
-
縦書きはSEO的に不利ですか?
-
perlで、[ \\r\\n , \\n ]の意...
-
CGIを勉強しています。¥n(改...
-
【HELP!!】Excelから保存したtx...
-
ポインター引数の関数でコンパ...
-
10Mバイトて文字数に すると何...
-
エクセルシート名の制限を変更...
-
UTF-8で5~6バイトになる文字コ...
-
バイナリとBCDコード
-
データの値の近いものをグルー...
-
COBOLのCOMP形式について
-
C言語 ファイル内のデータと入...
-
DataGridViewの特定列に入力さ...
-
ピクセル,dpiから容量(バイト...
-
SQLで1バイト、2バイト混在...
-
Excel 1セル当りの文字数が2...
-
C++ Builderで文字列をバイトに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBA メール作成について ...
-
number 改行が追加できない
-
CGIを勉強しています。¥n(改...
-
Rstudioによるテキストマイニン...
-
Line Inputにて改行があっても...
-
ホームページビルダーで行間を...
-
エクセルで「改行コード」を「...
-
改行コードがそのまま表示され...
-
perlで、[ \\r\\n , \\n ]の意...
-
Excelで、HTMLタグだけを削除す...
-
テキストボックスに入力された...
-
【HELP!!】Excelから保存したtx...
-
MACの改行コード変更について教...
-
一行掲示板を改行が入る掲示板...
-
メモ帳での改行
-
if文中で@***(配列変数)って...
-
非常に見にくいです.....
-
表(<table>)の直前が、改行さ...
-
alertの警告文を2行にしたい
-
CGIで改行タグを改行コードに変...
おすすめ情報