どのようにunless-と「IF!」文の異なる挙動は、スカラーコンテキストで範囲-オペレータに影響を与えるのでしょうか?

StackOverflow https://stackoverflow.com/questions/2395808

質問

http://novosial.org/perl/one-liner/ のオン

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の偽

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top