どのようにunless-と「IF!」文の異なる挙動は、スカラーコンテキストで範囲-オペレータに影響を与えるのでしょうか?
-
25-09-2019 - |
質問
I次の二つのワンライナーを見つけました。 unless
ステートメントは(結合性と優先順位ルールによる)if !
異なるため出力が異なっている。
cat file: foo bar
perl -ne 'print unless /^$/../^$/' file foo bar
perl -ne 'print if ! /^$/../^$/' file foo bar
どのようにif !
文の異なる動作は第2のワンライナーの出力を作るん1空白行?
解決
は、それが関連性の問題だと優先順位...
print unless /^$/../^$/
はprint if !(/^$/../^$/)
print if ! /^$/../^$/
はprint if (!/^$/)../^$/
なお、第1のネゲート範囲式、二ネゲートながら、範囲の開始条件ではなく、範囲そのものます。
他のヒント
答え、私見では、Perlで何if !
文が存在しないことである:if
文はありかつ!
演算子があります。 !
演算子はif
に結合しません。それは、その引数で動作します。あなたはこれらの用語で考え始める場合は、あなたの人生が容易になります。
だから、あなたのケースでは、あなたが持っている、
do_something() unless something;
と
do_something() if something-else;
通常は目に見えない括弧内レッツのputます:
do_something() unless ( something );
と
do_something() if ( something-else );
その条件の真理値がsomething-else
の真実と同等ですが、アカウントにしっかりsomething
演算子結合するという事実を取ることができなかったように、この場合は、あなたが書き込み!
に試してみました。
これnot
がある理由です。
試してみてください
perl -ne 'print if not /^$/../^$/' file
not
はperldoc perlopをの中で参照してください。
単項
not
はその右に、式の論理否定を返します。それは非常に低い優先度を除いて!
のと同等です。
範囲検定は、2番目のオペランドが真であることを時間に忠実アップを返します。それは、次の呼び出しではfalseを返します。
このスニペットを教えてくれる範囲演算子を返しているものを
perl -ne "$x= ( ! /^$/../^$/ ) ; print qq/$x : $_/" range_test.TXT
生成
1 : foo
2E0 :
:
:
1 : bar
最初の空白行が真の応答を生成するので、次の1の偽