電子書籍の厳選無料作品が豊富!

perlスクリプトなどで、判定文を記述する際の考え方について、
重箱の隅的な質問になりますが、よろしくお願いします。

(1)if等判定文での定数、変数の記述順序
例えば、ある変数が0であることを判定するのに、結果は同じなのですが、
[] if($a == 0)
[] if(0 == $a)
のどちらで書く方が良い(理にかなっている)のでしょうか?
(文字列でも同じでしょうか)
[] if("$a" eq "")
[] if("" eq "$a")

(2)私はよく上限、下限の判定を行う際に、
[] 0 < x < 10
ということを表現する際に、
数学的に見映え(並び順)が同じになるよう、
[] if((0 < $x) && ($x < 10)){
と書くのですが、(1)のことと照らし合わせると、
[] if(($x > 0) && ($x < 10)){
と書いたり、
[] if((0 < $x) && (10 > $x)){
と書くほうが良いでしょうか。


(3)以上の(1)(2)のことは、標準的なC言語でも同じでしょうか?


(4)Perl独特の書き方ですが、1行で済む実行文の場合、
[] 実行文 if(条件文);
と書く方が、
[] if(条件文) 実行文;
と書くよりも変換効率(?)か何かが良いと聞いたのですが、
どういう理由でどちらが良いとかありますか?


この辺の違いはコンパイラが吸収してくれるので、どちらでも良いとか、
何か参考になる文献などもありましたら、ご教示よろしくお願いします。

A 回答 (6件)

(1)


どちらが理にかなっているかといえば、断然前者でしょう。if (a == b) は 「AはBですか?」という文なので、定数==変数と書けば違和感があって当然です。
しかし、タイプミスによる代入のチェックのために後者を使うという文化も確かにあります。ですが、if 文での代入は
  perl -wc スクリプト名
とすれば警告されますから、すぐに見つけられるでしょう。

(2)
> 数学的に見映え(並び順)が同じになるよう、
> [] if((0 < $x) && ($x < 10)){

これは立派な心がけです。
プログラムを少しでも視覚的に分かりやすく書くことは、バグの混入を防ぐ効果があります。

(3)
これらはCでもC++でもJavaでも何でも、たいていの言語で同じです。

(4)
実行効率は変わらないでしょう。ベンチを取ったら少しは違うのかもしれませんが、速度の改善をコードに求めるのはアルゴリズムやデータ構造が完全に最適化された後にすることです。

Perlは構文上、if 文のブロックを省略できないので
  実行文 if 条件

  条件 and 実行文
  条件 or 実行文
という書き方を好む人も多いですが、Perlはそもそも少ないタイプでコードを書けるように、というコンセプトがあるので、会社などで制限されているのでなければ好みで使い分けてよいでしょう。

この辺のことはPerlの標準ドキュメント「perlstyle」にも書かれています。
シェルから「perldoc perlstyle」としても読めますが(英文)、下記に和訳がありますのでそちらも参照してみてください。

参考URL:http://perldoc.jp/docs/perl/5.8.0/perlstyle.pod
    • good
    • 0
この回答へのお礼

ありがとうございました。
教えて頂いたページでのLarry Wallさんのスタイルがタメになりました。
自分でも、あ、ここは同じ考えだ、ということが分かって勉強になりました。
お褒め頂いて光栄です。(笑)ありがとうございました。

お礼日時:2006/03/14 17:50

個人的には


if ($a == 0)...
と書きます. なんとなく
if (0 == $a)...
は不自然な感じだから.

ちなみに演算子のオーバーロードをするときには, 数値への変換関数を「+0」という名前で表現したりする (もちろん sub +0 () と書くわけではないが) ので, そのことをふまえると
if ($a + 0 == 0)...
が正しいのかもしれない. 絶対やらないけど.
    • good
    • 0
この回答へのお礼

ありがとうございました。

>>と書きます. なんとなく
>>if (0 == $a)...
>>は不自然な感じだから.

そうですね、私もパッと見で違和感を感じました。
ただ、下記にも色々とご意見頂いたように、それなりの理由があったようで、納得できました。

>> 数値への変換関数を「+0」という名前で表現したりする
私も、文字列の中から数字部を切り取った際に、念のためにこのようなことをやることがありました。
例えば、$a="wgt.123kg";で
$val=substr($a,4,3) + 0;
みたいに。

お礼日時:2006/03/14 17:41

(1)


可読性を考えると前者、デバッグやケアレスミスを考えると後者、かと思います。
いずれにせよ、やりやすいほうでいいと思います。

(2)
これも可読性の問題ですね。
数学的な並びのほうが読みやすいか、変数を頭に持ってきたほうが読みやすいかの違いでしょう。
Javaコーディング標準というドキュメントでは、右側に大きい値を常に持ってくる、つまり数学的な並びのほうが好ましいと書かれています。

(4)
if文を最後に書くほうが処理速度が向上します。
が、ほんのちょっとしか変わらないので速度を意識してわざわざ倒置させて書くことはしなくて良いと思います。
また、倒置構文で書くと、実行文が1文のとき"{ }"を省略できます。
利点としてはそんなもんでしょうか。
    • good
    • 0
この回答へのお礼

詳しい解説をありがとうございました。
たまたま今回の例に掲げたようなソースコードを見たもので、
そこらじゅうに徹底してコーディングされている様子から、
作者のものすごい”コダワリ”を感じ、これは何かあるはずだと
問い合わせさせて頂いた次第でした。

お礼日時:2006/03/14 17:32

(1) これは宗教論争になりそうなのでどっちが良いということは無いと思います。


# 私は前者を使っています

#2さんも仰っていますが、デバッグで苦労することはあります。(=と==の見間違いはよくあります)
上手く動かないときには、そこから疑うようになりますが…

また、perlには独自の比較 if ($x =~ /ABC/) などがあるので、前者の方が統一感が取れると思っています。
    • good
    • 0
この回答へのお礼

ありがとうございます。
>>また、perlには独自の比較 if ($x =~ /ABC/) などがあるので、
説得力がありますね。
私も定数を先に書くのは何となく違和感を感じるので、特に実行上での違いがないのであれば、
(文字列比較の方は、言わずもがなですね)変数を先に書くようにしたいと思います。

お礼日時:2006/03/14 14:37

(1)の部分的な回答ですが



if($a == 0)
if(0 == $a)

私は昔からのクセで後者です。というのは、

if($a = 0)

と記述して、デバッグに苦しむ経験を何度もしていますので(笑)

if(0 = $a)

と書けばコンパイラに怒られてすぐわかります。
    • good
    • 0
この回答へのお礼

タッチの差でNo.1さんにも同じ回答を頂きました。ありがとうございました。
長いことif($a == 0)で慣れているので、生理的な違和感を感じるのは否めません。。(苦笑

お礼日時:2006/03/14 14:34

こういうのは決まりがないので結論でませんよね。


ただ
if(0 == $val)
とすると
if(0 = $val)
と間違えたときにエラーがでるので使っているという話は聞いたことがあります。私は使ってませんが。
    • good
    • 0
この回答へのお礼

なるほど。確かに、定数を先に書いてあれば、= のみ記述のミスが防げますね。
誰から教わることもなく、長いこと自己流でプログラムをやってきましたが、目から鱗でした。
ありがとうございました。

お礼日時:2006/03/14 14:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!