nullオブジェクトのメソッドなどを実行しようとしてエラーが発生することはよくある。
これを回避する方法をいくつか考えてみた。
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 | $array = ("a","b","c","B",$null) $array | ?{$_.ToUpper() -eq "B"} "対策1" $ErrorActionPreference = "SilentlyContinue" $array | ?{$_.ToUpper() -eq "B"} $ErrorActionPreference = "continue" "対策2" $array | ?{try{$_.ToUpper() -eq "B"}catch{}} "対策3" $array | ?{$_} | ?{$_.ToUpper() -eq "B"} "対策4" $array | ?{$_ -and $_.ToUpper() -eq "B" } |
結果。
結果としてはどの対策も良さそうだ。
さてどれにしたものか。
対策1はちょっと無理やり的だしコーディング量も多いので却下。
対策2は悪くは無いと思うが、ブロックが増えるので若干書きづらい。
対策3は考え方が素直だしコーディング量的にも多くない。しかし、データ量が多い場合はパイプが増える分不利かもしれない。
対策4がコーディング量的にも性能的にもベターかとも思うが、幾分トリッキー?
これは、$_ がnullの時はand条件のそれ以降の判定が実行されないという動作を利用している。C#で言うところの&&演算子みたいな動作。しかし、 &&演算子と全く同じかというとそうでもなくて、nullでの除算などを行うとエラーになってしまうので使用に当たっては注意が必要。
結局、自分だけで使うスクリプトなら対策4、そうでなければ対策3、性能まで求められる処理ならば対策2といったところかな。
当然、素直にIFで判定しても良いけど。
0 件のコメント:
コメントを投稿