2011年4月10日日曜日

perl の文字列比較での失敗

perl の文字列比較で失敗したので、メモしておきます。

バグっていたのは、次のようなコードです。
$arch = `uname -m` ;
if ($arch == "x86_64") {
    ...
アーキテクチャが x86_64 の場合に、追加の処理を行うという内容なのですが、perl で文字列比較する場合には、正しくは eq を使う必要があり、== と書いてしまうと、数値比較となり、$arch == "x86_64" は常に真になってしまいます。それで、次のように修正しました。
$arch = `uname -m` ;
if ($arch eq "x86_64") {
    ...
これでうまく行くと思ったのですが、なぜか真にならず、意図したようには動きませんでした。テストプログラムを書いて格闘した結果・・・
$arch=`uname -m` ;
printf "%s\n", $arch ;
printf "%d\n", ($arch eq "x86_64") ;
printf "%d\n", ($arch eq "x86_64\n") ;
実行結果は次のとおりです。
x86_64

0
1
$arch の末尾に改行コードがついていたのが原因でした orz 。というわけで、最終的には次のように修正して、意図したとおりに動くようになりました。
$arch = `uname -m` ;
chomp($arch) ;
if ($arch eq "x86_64") {
    ...
この内容であれば、正規表現を使って $arch =~ /x86_64/ と書いておけば、2度までハマることもなかったのに・・・と思いましたが、最初からバグらないでプログラミングするのは難しいものですね。
人気ブログランキングへ にほんブログ村 IT技術ブログへ