$30 off During Our Annual Pro Sale. View Details »

||とorの違いは登壇して解決した

 ||とorの違いは登壇して解決した

sapi_kawahara

June 16, 2023
Tweet

More Decks by sapi_kawahara

Other Decks in Education

Transcript

  1. 2023年6月16日(金) 吉祥寺.pm 33 テーマ「原点」 自己紹介 • さっぴー川原 @sapi_kawahara • 老害エンジニア •

    住んでいるところは観光地の川越 • スキル ◦ ファミコンゲームの開発時代からのエンジニア。iモード登場時にはIT企業を経て、 SESで大手IT企業で常駐を経験。その後はスタートアップ企業に転職。多くの案件を 経験しており、対応できる開発言語は10を超える。 • コンピューター関連での原点っぽいのは沢山知っていると思う 2
  2. 2023年6月16日(金) 吉祥寺.pm 33 テーマ「原点」 短絡評価(ショートサーキット) • ちなみに、短絡評価(ショートサーキット)というのを、ご存知です か? • 論理和(|| or)なら優先順位が高い箇所がtrueになったら、そこ

    で論理演算を止めちゃう!! • 論理積(&& and)なら優先順位が高い箇所がfalseになったら、 そこで論理演算を止めちゃう!! • エンジニアでも、短絡評価(ショートサーキット)って気にせず使っ てることが多いよね? 9
  3. 2023年6月16日(金) 吉祥寺.pm 33 テーマ「原点」 親の顔をよりよく見るアレ • Perlの人なら、よく見ますよね????(主語が大きい) ◦ perl -e '$file="test.txt";

    open my $fh, "<",$file or die "not open file $file";' • ファイルがないときは、◯すアレです • test.txtというファイルがないと、論理和でfalseなので、dieが 実行されています • test.txtというファイルがあるときは、論理和でtrueなので、短 絡評価(ショートサーキット)が動作してdieが実行しません!! 10
  4. 2023年6月16日(金) 吉祥寺.pm 33 テーマ「原点」 疑問があれば試すべき • orの他に||も論理和だよな? • 疑問に思ったら試そう!!それが執筆の基本!! ◦ perl

    -e '$file="test.txt"; open my $fh, "<",$file || die "not open file $file";' • アレ??ファイルがないのに短絡評価(ショートサーキット)が動作 したよ??何で?? 11
  5. 2023年6月16日(金) 吉祥寺.pm 33 テーマ「原点」 アレ?と思ったらドキュメントを見る! • 疑問に思ったらドキュメントを確認だ!!!! ◦ https://perldoc.jp/docs/perl/5.18.1/perlop.pod#Logical32Define d-Or ◦

    Perl では、フロー制御に使う場合の && と || の同義語として、 and 演算子と or 演算子が用意されています (下記参照)。 短絡の動作は全く同じです。 しか し、"and" と "or" の優先順位はかなり低くしてあるので、引数に括弧を 使ってい ないリスト演算子のあとに続けて使う場合にも、 安心して使うことができます: 12
  6. 2023年6月16日(金) 吉祥寺.pm 33 テーマ「原点」 引数に括弧を使う • 括弧の花嫁 ◦ perl -e '$file="test.txt";

    (open my $fh, "<",$file) || die "not open file $file";' • ちゃんと◯ぬ • 正しく動作しました! • ファイルがあるときは、短絡評価(ショートサーキット)は動作しま せん!! 16
  7. 2023年6月16日(金) 吉祥寺.pm 33 テーマ「原点」 ちなみにPHPは同じ結果です • 試してみよう! ◦ php -r '$file="test.txt";@fopen($file,

    "r") or die("not open file $file.".PHP_EOL);' ◦ php -r '$file="test.txt";@fopen($file, "r") || die("not open file $file.".PHP_EOL);' 19
  8. 2023年6月16日(金) 吉祥寺.pm 33 テーマ「原点」 まとめ • ブーリアン(boolean)と短絡評価(ショートサーキット)は奥が深 い • この2つを調べてわかったけど、この辺りは、各言語で好き勝手 に実装しているw

    • そのため、多言語をやっている人は、他の言語の流儀で実装して しまいがち! ◦ その結果、下らんバグとして引っかかると思う • Perlの|| &&とor andの違いは、まだ理解してないので、誰か 教えてください 20
  9. 2023年6月16日(金) 吉祥寺.pm 33 テーマ「原点」 解決 • 登壇してフォローされました • || だと、先に$file ||

    dieが評価されるそうです • open文は最後まで実行するという思い込みが悪さした • 思い込み気をつけよう 21