CGI-BBS > CGI > Perl > 再びprint OUTに続く記述ですが (以前とは別の箇所)


カレッヂ
カレッヂ


質問者 SAYOKO  投稿日 7/23(月) 17:06:50
cgiプログラム内で受注内容を「注文書の写し」として発注者にメールを発行・送信しますが、
価格表示(ドル)の小数点が消えて以下が改行されてしまいます。
同様に送信される「注文書」は正常で、cart.cgiファイルの問題箇所を見ていますが、
Perlを詳しくマスターしていないので修正できません。
「注文書」と「注文書の写し」を発行・送信する箇所と思われる部分をコピーしますので、
恐れ入りますが、修正部分と修正方法をお教え頂きたいのですが、是非に宜しくお願いします。

両者で記述が違うと思った部分の左隅に★印をします。

注文書の発行・送信箇所-----------------------------------------------------------
if (!open(INFO,$info_file)) { &error("!設定エラー","特定商取引に関する表\示について設定したファイルが見つかりません。"); }
@info = <INFO>;
close(INFO);

if (open(ADDR,">> $order_csv")) {

        foreach $write (@formCSV) {

                if ($write eq '$NUMBER') { push(@CSV,$date_num); }
                elsif ($write eq '$ORDER') { $orders =~ s/\n//g; push(@CSV,$orders); }
                elsif ($write eq '$DATE') { push(@CSV,$date_now); }
                elsif ($write eq '$EMAIL') { push(@CSV,$in{'_email'}); }
                elsif ($write eq '$REMOTE_USER') { push(@CSV,$REMOTE_USER); }
                else {
                        $write =~ s/&quot;/"/g;
                        $write =~ s/&amp;/&/g;
                        $write =~ s/&lt;/</g;
                        $write =~ s/&gt;/>/g;

                        push(@CSV,$in{$write});
                }
        }

        print ADDR &EncodeCSV(@CSV) . "\n";
        close(ADDR);
}

if (!open(OUT,"| $sendmail -t")) { &error("異常停止",$!); }

print OUT &jis("X-Processed: $date_now\n");
print OUT "X-SENDER: $REMOTE_HOST\[$REMOTE_ADDR\]\n";
print OUT &jis("X-AGENT: $HTTP_USER_AGENT\n");
print OUT "From: $mailto_order\n";
print OUT "To: $mailto_order\n";
print OUT "Reply-To: $in{'_email'}\n";
print OUT &jis("Subject: [$date_num] $mail_subject\n");
print OUT "Content-Transfer-Encoding: 7bit\n";
print OUT "Content-Type: text/plain; charset=iso-2022-jp\n\n";

print OUT "\n";
foreach (@in) {

        s/&quot;/"/g;
        s/&amp;/&/g;
        s/&lt;/</g;
        s/&gt;/>/g;

★        if (/^\.\t(.*)/) { print OUT &jis("$1\n"); }        
        elsif (/(.*)\t(.*)/) { print OUT &jis("[$1]\n$2\n\n"); }
}
print OUT "\n";

print OUT &jis("$sign\n");
close(OUT);

sleep(1);
注文書の写しの発行・送信箇所-----------------------------------------------------
if (!open(OUT,"| $sendmail -t")) { &error("異常停止",$!); }

print OUT &jis("X-Processed: $date_now\n");
print OUT "X-SENDER: $REMOTE_HOST\[$REMOTE_ADDR\]\n";
print OUT &jis("X-AGENT: $HTTP_USER_AGENT\n");
print OUT "From: $mailto_order\n";
print OUT "To: $in{'_email'}\n";
print OUT &jis("Subject: [$date_num] $copy_subject\n");
print OUT "Content-Transfer-Encoding: 7bit\n";
print OUT "Content-Type: text/plain; charset=iso-2022-jp\n\n";

print OUT &jis("$mail_mes\n");

print OUT "\n";
foreach (@in) {

        s/&quot;/"/g;
        s/&amp;/&/g;
        s/&lt;/</g;
        s/&gt;/>/g;

★        if (/^\.\t(.*)/) { $l = $1; $l =~ s/\./\n/g; print OUT &jis("$l\n"); }
        elsif (/(.*)\t(.*)/) { print OUT &jis("[$1]\n$2\n\n"); }
}
print OUT "\n";

print OUT &jis("---特定商取引に関する法律による表\示---\n\n");
foreach (@info) { print OUT &jis($_); }
print OUT "\n";

print OUT &jis("$sign\n");
close(OUT);

1 while $date_num =~ s/(.*\d)(\d\d\d\d)/$1-$2/g;

print "Set-Cookie: $ENV{'SCRIPT_NAME'}:0=$cookie_set\n";
回答者 yaku sima  [削除]  投稿日 7/24(火) 00:43:11
またまた、yaku simaです。今回は意図しない正規表現でのエラーですね。

orig>if (/^\.\t(.*)/) { print OUT &jis("$1\n"); }

copy>if (/^\.\t(.*)/) { $l = $1; $l =~ s/\./\n/g; print OUT &jis("$l\n"); }

小数点で改行される原因は、

$l=~s/\./\n/g;

です。ここでは、例えば、($pi=atan2(1,1)*4;)

.\t3.14159265358979

なら、if文の条件文で$_=~/^\.\t(.*)/ となっているので、$1には3.14159265358979 が入りますね。そして、$1は変数でないので、$line($lは見にくいので)なるグローバル変数を一時作って、それに代入します。
次にこの$line をs///gで$line 内のすべてのdot(.)を改行(\n)に置換しています。それをprint OUT jis("$line\n") しています。したがって、

3\n14159265358979

と表示されのでしょう。

>価格表示(ドル)の小数点が消えて以下が改行されてしまいます。

小数点がほしければ、わたしならcopyを一寸修正して、

copy>if (/^\.\t(.*)/) { $l = $1; $l =~ s/\./\n/g; print OUT &jis("$l\n"); }

/^\.\t(.*)/ and print OUT jis("$1\n");

と、こう書きます。origのままでも同じです。

正規表現もがんばってくださいね。

返信(回答)する


Web裏技