- ベストアンサー
sprintfで0ならスペースにしたい
お世話になります。 sprintfを使って編集しています。 3桁で統一したいため、 $trm01 = sprintf("%3d",$trm01); のようにやっています。 $trm01が0の場合、3桁のスペースとしたいのですが。 宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
CGIを通してブラウザーで確認されているのだと想像しますが、まず、コマンド ラインでチェックすることをお薦めします。 C:\>perl test.cgi コマンドラインでエラーが出ないことを確かめてからCGIで実行します。 CGIで実行するとき、以下の文を書いておくと、エラーがブラウザーに表示され ます。 use CGI::Carp qw(fatalsToBrowser); 変数に何が入っているのかを調べるとき、print文でもいいのですが、undefと 空文字列との区別がつかないときや、配列・ハッシュを一覧で見たいとき等は 以下のように書くと詳細がわかります。 use Data::Dumper; print Dumper \$trm01; あと、HTMLの仕様で連続空白は1つの空白として表示されてしまいます。 なので、TacosanさんがNo.1で提示されたコードは、以下の意味だと思われます。 $trm01 = $trm01 ? sprintf("%3d",$trm01) : ' 'x3;
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
「$trm01が無い」とは, 厳密にはどのような意味でしょうか? 「値がまったくない」と「値はあるけど空文字列」では意味が違いますよね. この 2つのいずれかでしょうか? あるいは両方とも「$trm01が無い」に含まれるのでしょうか? ちなみに後者の「両方 OK」なら現状でいいと思います. あと, #2 で 「そのまま」とは, 具体的にはどのように書いたのでしょうか と書いたのは, 「あなたが書いたものをここに出してくれ」ってことです. ひとによって「そのまま」の意味が変わりうるので. ひょっとして「教えていただいた例示をそっくりコピーして貼り付けました。」というのは, 「本当にそのまま」書いたんですか? もしそうなら, エラーになるに決まっています. sprintf の中の「...」は省略しているだけであって, 「本当にそう書く」という意味ではありません.
お礼
何回も有り難うございます。 私のレベルの低さを痛感しています。 言われていることは分かるのですが、説明が上手くありません。 もう少し勉強します。 少なくとも教えていただいた、「?」比較条件式?は勉強できましたし、 オーソドックスな書き方では動いています。 どうもお世話になりました。
- Tacosan
- ベストアンサー率23% (3656/15482)
条件演算子は代入より強いので $trm01 = $trm01 ? sprintf(...) : ' '; は $trm01 = ($trm01 ? sprintf(...) : ' '); の意味です. で, 「そのまま」とは, 具体的にはどのように書いたのでしょうか? また, 「エラーになった」というのはどのようなエラーになったのですか?
お礼
何回も有り難うございます。 >「そのまま」とは, 具体的にはどのように 教えていただいた例示をそっくりコピーして貼り付けました。 >「エラーになった」というのはどのようなエラー 500番の「エラーがあるため表示できません」です。 申し訳在りませんが、 私の技量は教えていただいているレベルにないと思います。 なので、マニュアル(HP)を読みあさり、 $trm01 = ($trm01 eq "") ? " " : sprintf("%3d",$trm01); の如くにして動かしています。 教えていただいている内容はこれと同じなのでしょうか。 今ひとつ難しいです。 宜しくお願いします。
補足
申し訳在りません。 読み返していて(本人だけ分かっていたのですが)言葉足らずに気が付きました。 質問で、 sprintfを使って編集しています。 3桁で統一したいため、 $trm01 = sprintf("%3d",$trm01); のようにやっています。 $trm01が0の場合、3桁のスペースとしたいのですが。 と言いましたが、 3桁で統一したいため、 $trm01 = sprintf("%3d",$trm01); とやって結果が0の場合とは、 $trm01のデータが無いため0となるモノです。 従って、 $trm01が無い場合に0とせず、スペースにしたい、 と言うのが正しい質問でした。 申し訳在りません。 遅ればせながら訂正します。 宜しくお願いします。
- Tacosan
- ベストアンサー率23% (3656/15482)
あきらめて $trm01 = $trm01 ? sprintf(...) : ' '; が簡単じゃないかな.
お礼
早速有り難うございます。 ズバリは無いのですね、了解です。 ところで、 教えていただいた方法を調べたところ、 $trm01 = $trm01 が比較で、sprintf(...)が真の時、' 'が偽の時と出ていました。 やりたいことから推測するに、 $trm01 = $trm01 は $trm01は0ではないか、と聞いて(比較して)いて、 sprintf(...) はそのまま表示、 ' ' は $trm01をスペースにする、 という意味でしょうか。 教えていただいたそのまま使ったら、エラーになりました。 分からなくて済みません、 宜しくお願いします。
お礼
やりとりを見かねてのご回答かと思いますが、 有り難うございます。 cgiの確認はperlのフリーウェアでPC上のシミュレーションでやっています。 コマンドラインの使い方は初めてでした。 いろいろと確認のテクニックが在るみたいですね。 一つづつおさらいをしておきます。 有り難うございました。