diff options
Diffstat (limited to 'services/nuldoc/public/blog/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html')
| -rw-r--r-- | services/nuldoc/public/blog/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html | 751 |
1 files changed, 384 insertions, 367 deletions
diff --git a/services/nuldoc/public/blog/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html b/services/nuldoc/public/blog/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html index acdaaacb..bc241b69 100644 --- a/services/nuldoc/public/blog/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html +++ b/services/nuldoc/public/blog/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html @@ -158,80 +158,81 @@ 特に、C言語でこのような試みをおこなったことがあるかたならそう思うだろう。事実、Cでのこの制約はほとんど無意味に等しい。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#24292E">#</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">i</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">n</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">c</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">l</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">u</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">d</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">e</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#D73A49"><</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">s</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">t</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">d</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">i</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">o</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">.</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">h</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#D73A49">></span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#6A737D">/*</span></span> -<span class="line"><span style="color:#6A737D">*/</span></span> -<span class="line"><span style="color:#24292E">i</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">n</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">t</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#6A737D">/*</span></span> -<span class="line"><span style="color:#6A737D">*/</span></span> -<span class="line"><span style="color:#24292E">m</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">a</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">i</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#6F42C1">n</span><span style="color:#24292E">(</span></span> -<span class="line"><span style="color:#24292E">){</span></span> -<span class="line"><span style="color:#24292E">f</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">o</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#6F42C1">r</span><span style="color:#24292E">(</span></span> -<span class="line"><span style="color:#24292E">i</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">n</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">t</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#6A737D">/*</span></span> -<span class="line"><span style="color:#6A737D">*/</span></span> -<span class="line"><span style="color:#24292E">i</span><span style="color:#D73A49">=</span></span> -<span class="line"><span style="color:#005CC5">1</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">i</span><span style="color:#D73A49"><</span></span> -<span class="line"><span style="color:#005CC5">1\</span></span> -<span class="line"><span style="color:#005CC5">0\</span></span> -<span class="line"><span style="color:#005CC5">0</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">i</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#D73A49">+</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#D73A49">+</span><span style="color:#24292E">)</span></span> -<span class="line"><span style="color:#D73A49">if</span></span> -<span class="line"><span style="color:#24292E">(i</span></span> -<span class="line"><span style="color:#D73A49">%</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#005CC5">15</span></span> -<span class="line"><span style="color:#D73A49">==</span></span> -<span class="line"><span style="color:#005CC5">0</span><span style="color:#24292E">)</span></span> -<span class="line"><span style="color:#24292E">p</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">r</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">i</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">n</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#24292E">t</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#6F42C1">f</span><span style="color:#24292E">(</span></span> -<span class="line"><span style="color:#032F62">"</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#032F62">F</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#032F62">i</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#032F62">z</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#032F62">z</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#032F62">B</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#032F62">u</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#032F62">z</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#032F62">z</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#B31D28;font-style:italic">%</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#032F62">c</span><span style="color:#005CC5">\</span></span> -<span class="line"><span style="color:#032F62">"</span><span style="color:#24292E">,</span></span> -<span class="line"><span style="color:#005CC5">10</span></span> -<span class="line"><span style="color:#24292E">);</span></span> -<span class="line"></span> -<span class="line"><span style="color:#6A737D">/* あとは同じように普通のプログラムを変形するだけなので省略 */</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">#\ +i\ +n\ +c\ +l\ +u\ +d\ +e\ +<\ +s\ +t\ +d\ +i\ +o\ +.\ +h\ +>\ +</span><span style="color: #6e7781">/* +*/</span><span style="color: #6e7781"> +</span><span style="color: #24292f;background-color: #f6f8fa">i</span>\ +<span style="color: #24292f;background-color: #f6f8fa">n</span>\ +<span style="color: #24292f;background-color: #f6f8fa">t</span>\ +<span style="color: #6e7781">/* +*/</span> +<span style="color: #24292f;background-color: #f6f8fa">m</span>\ +<span style="color: #24292f;background-color: #f6f8fa">a</span>\ +<span style="color: #24292f;background-color: #f6f8fa">i</span>\ +<span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +<span style="color: #24292f;background-color: #f6f8fa">){</span> +<span style="color: #24292f;background-color: #f6f8fa">f</span>\ +<span style="color: #24292f;background-color: #f6f8fa">o</span>\ +<span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +<span style="color: #24292f;background-color: #f6f8fa">i</span>\ +<span style="color: #24292f;background-color: #f6f8fa">n</span>\ +<span style="color: #24292f;background-color: #f6f8fa">t</span>\ +<span style="color: #6e7781">/* +*/</span> +<span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">=</span> +<span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae"><</span> +<span style="color: #0550ae">1</span>\ +<span style="color: #0550ae">0</span>\ +<span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #24292f;background-color: #f6f8fa">i</span>\ +<span style="color: #0550ae">+</span>\ +<span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +<span style="color: #cf222e">if</span> +<span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> +<span style="color: #0550ae">%</span>\ +<span style="color: #0550ae">15</span> +<span style="color: #0550ae">==</span> +<span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +<span style="color: #24292f;background-color: #f6f8fa">p</span>\ +<span style="color: #24292f;background-color: #f6f8fa">r</span>\ +<span style="color: #24292f;background-color: #f6f8fa">i</span>\ +<span style="color: #24292f;background-color: #f6f8fa">n</span>\ +<span style="color: #24292f;background-color: #f6f8fa">t</span>\ +<span style="color: #24292f;background-color: #f6f8fa">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +<span style="color: #0a3069">"\ +F\ +i\ +z\ +z\ +B\ +u\ +z\ +z\ +%\ +c\ +"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +<span style="color: #0550ae">10</span> +<span style="color: #24292f;background-color: #f6f8fa">);</span> + +<span style="color: #6e7781">/* あとは同じように普通のプログラムを変形するだけなので省略 */</span> +</code></pre> </div> <p> バックスラッシュを使った行継続がトークンを区切らない、というのがポイントだ。 @@ -273,10 +274,11 @@ また、2文字だと文字列がまともに書けないのも辛い。<code>''</code> だけで2文字使うので、「1文字の文字列リテラル」というものを書くことができない。PHP では文字列リテラル中に生の改行が書けるので </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#24292E">$a</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#032F62">'</span></span> -<span class="line"><span style="color:#032F62">a'</span></span> -<span class="line"><span style="color:#24292E">;;</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$a</span> +<span style="color: #0550ae">=</span><span style="color: #0a3069">' +a'</span> +<span style="color: #24292f;background-color: #f6f8fa">;;</span> +</code></pre> </div> <p> とすると <code>$a</code> は <code>"\na"</code> になるのだが、余計な改行が入ってしまう。 @@ -293,11 +295,12 @@ まずは普通に書くとしよう。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49"><?</span><span style="color:#005CC5">php</span></span> -<span class="line"></span> -<span class="line"><span style="color:#D73A49">for</span><span style="color:#24292E"> ($i </span><span style="color:#D73A49">=</span><span style="color:#005CC5"> 1</span><span style="color:#24292E">; $i </span><span style="color:#D73A49"><</span><span style="color:#005CC5"> 100</span><span style="color:#24292E">; $i</span><span style="color:#D73A49">++</span><span style="color:#24292E">) {</span></span> -<span class="line"><span style="color:#005CC5"> echo</span><span style="color:#24292E"> (($i </span><span style="color:#D73A49">%</span><span style="color:#005CC5"> 3</span><span style="color:#D73A49"> ?</span><span style="color:#032F62"> ''</span><span style="color:#D73A49"> :</span><span style="color:#032F62"> 'Fizz'</span><span style="color:#24292E">) </span><span style="color:#D73A49">.</span><span style="color:#24292E"> ($i </span><span style="color:#D73A49">%</span><span style="color:#005CC5"> 5</span><span style="color:#D73A49"> ?</span><span style="color:#032F62"> ''</span><span style="color:#D73A49"> :</span><span style="color:#032F62"> 'Buzz'</span><span style="color:#24292E">) </span><span style="color:#D73A49">?:</span><span style="color:#24292E"> $i) </span><span style="color:#D73A49">.</span><span style="color:#032F62"> "</span><span style="color:#005CC5">\n</span><span style="color:#032F62">"</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">}</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> + +<span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$i</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$i</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #cf222e">echo</span> <span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Fizz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">5</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Buzz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">?:</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #24292f;background-color: #f6f8fa">}</span> +</code></pre> </div> <p> 素直に書いた fizzbuzz とは言い難いが、このくらいは普通だということにしておかないと、この先がやっていられないので許してほしい。 @@ -309,14 +312,15 @@ <code>for</code> は、3文字もある長いキーワードである。こんなものは使えない。<code>array_</code> 系の関数を使って、適当に置き換えるとしよう。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49"><?</span><span style="color:#005CC5">php</span></span> -<span class="line"></span> -<span class="line"><span style="color:#24292E">$s </span><span style="color:#D73A49">=</span><span style="color:#005CC5"> range</span><span style="color:#24292E">(</span><span style="color:#005CC5">1</span><span style="color:#24292E">, </span><span style="color:#005CC5">100</span><span style="color:#24292E">);</span></span> -<span class="line"><span style="color:#005CC5">array_walk</span><span style="color:#24292E">(</span></span> -<span class="line"><span style="color:#24292E">$s,</span></span> -<span class="line"><span style="color:#D73A49">fn</span><span style="color:#24292E">($i) =></span></span> -<span class="line"><span style="color:#005CC5">printf</span><span style="color:#24292E">((($i </span><span style="color:#D73A49">%</span><span style="color:#005CC5"> 3</span><span style="color:#D73A49"> ?</span><span style="color:#032F62"> ''</span><span style="color:#D73A49"> :</span><span style="color:#032F62"> 'Fizz'</span><span style="color:#24292E">) </span><span style="color:#D73A49">.</span><span style="color:#24292E"> ($i </span><span style="color:#D73A49">%</span><span style="color:#005CC5"> 5</span><span style="color:#D73A49"> ?</span><span style="color:#032F62"> ''</span><span style="color:#D73A49"> :</span><span style="color:#032F62"> 'Buzz'</span><span style="color:#24292E">) </span><span style="color:#D73A49">?:</span><span style="color:#24292E"> $i) </span><span style="color:#D73A49">.</span><span style="color:#032F62"> "</span><span style="color:#005CC5">\n</span><span style="color:#032F62">"</span><span style="color:#24292E">),</span></span> -<span class="line"><span style="color:#24292E">);</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> + +<span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +<span style="color: #953800">array_walk</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +<span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +<span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> +<span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(((</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Fizz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">5</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Buzz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">?:</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +<span style="color: #24292f;background-color: #f6f8fa">);</span> +</code></pre> </div> <p> <code>array_walk</code> や <code>range</code>、<code>printf</code> といった <code>for</code> よりも長いトークンが現れてしまったが、これは次節で直すことにする。なお、<code>echo</code> は文 (statement) であり式 (expression) ではないので、式である <code>printf</code> に置き換えた。 @@ -328,18 +332,19 @@ <code>range</code>、<code>array_walk</code>、<code>printf</code> は長すぎるのでどうにかせねばならない。ここで、PHP の可変関数を使う。可変関数とは、関数名が文字列として入った変数を経由して、関数を呼び出す機能である。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49"><?</span><span style="color:#005CC5">php</span></span> -<span class="line"></span> -<span class="line"><span style="color:#24292E">$r </span><span style="color:#D73A49">=</span><span style="color:#032F62"> 'range'</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$w </span><span style="color:#D73A49">=</span><span style="color:#032F62"> 'array_walk'</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$p </span><span style="color:#D73A49">=</span><span style="color:#032F62"> 'printf'</span><span style="color:#24292E">;</span></span> -<span class="line"></span> -<span class="line"><span style="color:#24292E">$s </span><span style="color:#D73A49">=</span><span style="color:#24292E"> $r(</span><span style="color:#005CC5">1</span><span style="color:#24292E">, </span><span style="color:#005CC5">100</span><span style="color:#24292E">);</span></span> -<span class="line"><span style="color:#24292E">$w(</span></span> -<span class="line"><span style="color:#24292E">$s,</span></span> -<span class="line"><span style="color:#D73A49">fn</span><span style="color:#24292E">($i) =></span></span> -<span class="line"><span style="color:#24292E">$p((($i </span><span style="color:#D73A49">%</span><span style="color:#005CC5"> 3</span><span style="color:#D73A49"> ?</span><span style="color:#032F62"> ''</span><span style="color:#D73A49"> :</span><span style="color:#032F62"> 'Fizz'</span><span style="color:#24292E">) </span><span style="color:#D73A49">.</span><span style="color:#24292E"> ($i </span><span style="color:#D73A49">%</span><span style="color:#005CC5"> 5</span><span style="color:#D73A49"> ?</span><span style="color:#032F62"> ''</span><span style="color:#D73A49"> :</span><span style="color:#032F62"> 'Buzz'</span><span style="color:#24292E">) </span><span style="color:#D73A49">?:</span><span style="color:#24292E"> $i) </span><span style="color:#D73A49">.</span><span style="color:#032F62"> "</span><span style="color:#005CC5">\n</span><span style="color:#032F62">"</span><span style="color:#24292E">),</span></span> -<span class="line"><span style="color:#24292E">);</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> + +<span style="color: #0550ae">$r</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'range'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #0550ae">$w</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'array_walk'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #0550ae">$p</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'printf'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> + +<span style="color: #0550ae">$s</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$r</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +<span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +<span style="color: #0550ae">$s</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +<span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> +<span style="color: #0550ae">$p</span><span style="color: #24292f;background-color: #f6f8fa">(((</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Fizz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">5</span> <span style="color: #0550ae">?</span> <span style="color: #0a3069">''</span> <span style="color: #0550ae">:</span> <span style="color: #0a3069">'Buzz'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">?:</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">.</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +<span style="color: #24292f;background-color: #f6f8fa">);</span> +</code></pre> </div> <p> これで関数を呼び出している所は短くなった。では、<code>$r</code> や <code>$w</code> や <code>$p</code>、また <code>'Fizz'</code> や <code>'Buzz'</code> はどうやって 1 行 2 文字に収めるのか。次のテクニックへ移ろう。 @@ -361,26 +366,28 @@ というルールがない場合、「未定義の定数が評価された場合、その定数の名前が値になる」という PHP 7.x までの仕様が利用できる。例えば、 <code>Fizz</code> という文字列が欲しければ、次のようにする。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#24292E">$f</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#005CC5">F</span></span> -<span class="line"><span style="color:#D73A49">.</span><span style="color:#005CC5">i</span></span> -<span class="line"><span style="color:#D73A49">.</span><span style="color:#005CC5">z</span></span> -<span class="line"><span style="color:#D73A49">.</span><span style="color:#005CC5">z</span></span> -<span class="line"><span style="color:#24292E">;;</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$f</span> +<span style="color: #0550ae">=</span><span style="color: #953800">F</span> +<span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">i</span> +<span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">z</span> +<span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">z</span> +<span style="color: #24292f;background-color: #f6f8fa">;;</span> +</code></pre> </div> <p> こうして簡単に文字列を作れる。なお、この仕様は 7.x 時点でも警告を受けるので、<code>@</code> 演算子を使って抑制してやるとよい。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#24292E">$f</span></span> -<span class="line"><span style="color:#D73A49">=@</span></span> -<span class="line"><span style="color:#005CC5">F</span><span style="color:#D73A49">.</span></span> -<span class="line"><span style="color:#D73A49">@</span><span style="color:#005CC5">i</span></span> -<span class="line"><span style="color:#D73A49">.</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#D73A49">@</span><span style="color:#005CC5">z</span></span> -<span class="line"><span style="color:#D73A49">.</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#D73A49">@</span><span style="color:#005CC5">z</span></span> -<span class="line"><span style="color:#24292E">;;</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$f</span> +<span style="color: #0550ae">=@</span> +<span style="color: #953800">F</span><span style="color: #0550ae">.</span> +<span style="color: #0550ae">@</span><span style="color: #24292f;background-color: #f6f8fa">i</span> +<span style="color: #0550ae">.</span><span style="color: #6e7781"># +@z</span> +<span style="color: #0550ae">.</span><span style="color: #6e7781"># +@z</span> +<span style="color: #24292f;background-color: #f6f8fa">;;</span> +</code></pre> </div> <p> むしろ、このことがわかっていたからこそ PHP 8.x での動作を要件に課したところがある。 @@ -395,66 +402,70 @@ ずばり、文字列同士のビット演算を使う。PHP では、文字列同士でビット演算 (<code>&</code>、<code>|</code>、<code>^</code>) をした場合、文字列の各バイトごとに指定したビット演算がなされ、それを結合したものが演算結果となる。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#24292E">$a </span><span style="color:#D73A49">=</span><span style="color:#032F62"> "12345"</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$b </span><span style="color:#D73A49">=</span><span style="color:#032F62"> "world"</span><span style="color:#24292E">;</span></span> -<span class="line"></span> -<span class="line"><span style="color:#6A737D">// $a ^ $b は次のコードと同じ</span></span> -<span class="line"><span style="color:#24292E">$result </span><span style="color:#D73A49">=</span><span style="color:#032F62"> ''</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#D73A49">for</span><span style="color:#24292E"> ($i </span><span style="color:#D73A49">=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">; $i </span><span style="color:#D73A49"><</span><span style="color:#005CC5"> min</span><span style="color:#24292E">(</span><span style="color:#005CC5">strlen</span><span style="color:#24292E">($a), </span><span style="color:#005CC5">strlen</span><span style="color:#24292E">($b)); $i</span><span style="color:#D73A49">++</span><span style="color:#24292E">) {</span></span> -<span class="line"><span style="color:#24292E">$result </span><span style="color:#D73A49">.=</span><span style="color:#24292E"> $a[$i] </span><span style="color:#D73A49">^</span><span style="color:#24292E"> $b[$i];</span></span> -<span class="line"><span style="color:#24292E">}</span></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5">echo</span><span style="color:#24292E"> $result;</span></span> -<span class="line"><span style="color:#6A737D">// => F]AXQ</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$a</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">"12345"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">"world"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> + +<span style="color: #6e7781">// $a ^ $b は次のコードと同じ</span> +<span style="color: #0550ae">$result</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$i</span> <span style="color: #0550ae"><</span> <span style="color: #953800">min</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$a</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">strlen</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">));</span> <span style="color: #0550ae">$i</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +<span style="color: #0550ae">$result</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #0550ae">$a</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +<span style="color: #24292f;background-color: #f6f8fa">}</span> + +<span style="color: #cf222e">echo</span> <span style="color: #0550ae">$result</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #6e7781">// => F]AXQ</span> +</code></pre> </div> <p> これを踏まえ、次のコードを見てみよう。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#24292E">$x </span><span style="color:#D73A49">=</span><span style="color:#032F62"> "x</span><span style="color:#005CC5">\n</span><span style="color:#032F62">Om</span><span style="color:#005CC5">\n</span><span style="color:#032F62">"</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$y </span><span style="color:#D73A49">=</span><span style="color:#032F62"> "</span><span style="color:#005CC5">\n</span><span style="color:#032F62">k!</span><span style="color:#005CC5">\n</span><span style="color:#032F62">o"</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$r </span><span style="color:#D73A49">=</span><span style="color:#24292E"> $x </span><span style="color:#D73A49">^</span><span style="color:#24292E"> $y;</span></span> -<span class="line"><span style="color:#005CC5">echo</span><span style="color:#032F62"> "</span><span style="color:#24292E">$r</span><span style="color:#005CC5">\n</span><span style="color:#032F62">"</span><span style="color:#24292E">;</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">"x</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">Om</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">k!</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">o"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #0550ae">$r</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0550ae">$r</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</code></pre> </div> <p> 実行すると、<code>range</code> が表示される。さて、PHP では文字列リテラル中に生の改行を直接書いてもよいのだった (「主な障害」の節を参照のこと)。書きかえてみよう。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#032F62">'x</span></span> -<span class="line"><span style="color:#032F62">Om</span></span> -<span class="line"><span style="color:#032F62">'</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#032F62">'</span></span> -<span class="line"><span style="color:#032F62">k!</span></span> -<span class="line"><span style="color:#032F62">o'</span></span> -<span class="line"><span style="color:#24292E">;</span></span> -<span class="line"></span> -<span class="line"><span style="color:#24292E">$r </span><span style="color:#D73A49">=</span><span style="color:#24292E"> $x </span><span style="color:#D73A49">^</span><span style="color:#24292E"> $y;</span></span> -<span class="line"><span style="color:#005CC5">echo</span><span style="color:#032F62"> "</span><span style="color:#24292E">$r</span><span style="color:#005CC5">\n</span><span style="color:#032F62">"</span><span style="color:#24292E">;</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$x</span> +<span style="color: #0550ae">=</span><span style="color: #0a3069">'x +Om +'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #0550ae">$y</span> +<span style="color: #0550ae">=</span><span style="color: #0a3069">' +k! +o'</span> +<span style="color: #24292f;background-color: #f6f8fa">;</span> + +<span style="color: #0550ae">$r</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0550ae">$r</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</code></pre> </div> <p> さらに <code>#</code> を使って適当に調整すると、次のようになる。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#032F62">'x</span></span> -<span class="line"><span style="color:#032F62">Om</span></span> -<span class="line"><span style="color:#032F62">'</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#032F62">'</span></span> -<span class="line"><span style="color:#032F62">k!</span></span> -<span class="line"><span style="color:#032F62">o'</span></span> -<span class="line"><span style="color:#24292E">;</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$r</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">^</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#24292E">;</span><span style="color:#6A737D">#</span></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5">echo</span><span style="color:#032F62"> "</span><span style="color:#24292E">$r</span><span style="color:#005CC5">\n</span><span style="color:#032F62">"</span><span style="color:#24292E">;</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$x</span> +<span style="color: #0550ae">=</span><span style="color: #6e7781"># +'x</span> +<span style="color: #953800">Om</span> +<span style="color: #0a3069">'; +$y +='</span> +<span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">!</span> +<span style="color: #24292f;background-color: #f6f8fa">o</span><span style="color: #f6f8fa;background-color: #82071e">'</span> +<span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #6e7781"># +$r</span> +<span style="color: #0550ae">=</span><span style="color: #6e7781"># +$x</span> +<span style="color: #0550ae">^</span><span style="color: #6e7781"># +$y</span> +<span style="color: #24292f;background-color: #f6f8fa">;</span><span style="color: #6e7781"># +</span> +<span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0550ae">$r</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</code></pre> </div> <p> 1行あたり2文字で、<code>range</code> という文字列を生成することに成功した。他の必要な文字列にも、同様の処理をほどこす。 @@ -470,155 +481,156 @@ 完成したものがこちら。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49"><?</span><span style="color:#005CC5">php</span></span> -<span class="line"></span> -<span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#032F62">'i</span></span> -<span class="line"><span style="color:#032F62">S'</span></span> -<span class="line"><span style="color:#24292E">;;</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#032F62">'</span></span> -<span class="line"><span style="color:#032F62">b!</span></span> -<span class="line"><span style="color:#032F62">'</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$c</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">^</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#24292E">;</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#032F62">'x</span></span> -<span class="line"><span style="color:#032F62">Om</span></span> -<span class="line"><span style="color:#032F62">'</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#032F62">'</span></span> -<span class="line"><span style="color:#032F62">k!</span></span> -<span class="line"><span style="color:#032F62">o'</span></span> -<span class="line"><span style="color:#24292E">;</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$r</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">^</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#24292E">;</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#032F62">'k</span></span> -<span class="line"><span style="color:#032F62">Sk</span></span> -<span class="line"><span style="color:#032F62">~}</span></span> -<span class="line"><span style="color:#032F62">Ma</span></span> -<span class="line"><span style="color:#032F62">'</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#032F62">'</span></span> -<span class="line"><span style="color:#032F62">x!</span></span> -<span class="line"><span style="color:#032F62">s!</span></span> -<span class="line"><span style="color:#032F62">k!</span></span> -<span class="line"><span style="color:#032F62">'</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$w</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">^</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#24292E">;</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#032F62">'z</span></span> -<span class="line"><span style="color:#032F62">Hd</span></span> -<span class="line"><span style="color:#032F62">G'</span></span> -<span class="line"><span style="color:#24292E">;</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#032F62">'</span></span> -<span class="line"><span style="color:#032F62">x!</span></span> -<span class="line"><span style="color:#032F62">~!</span></span> -<span class="line"><span style="color:#032F62">'</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$p</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">^</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#24292E">;</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#032F62">'L</span></span> -<span class="line"><span style="color:#032F62">[p</span></span> -<span class="line"><span style="color:#032F62">'</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#032F62">'</span></span> -<span class="line"><span style="color:#032F62">c!</span></span> -<span class="line"><span style="color:#032F62">'</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$f</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">^</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#24292E">;</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#032F62">'H</span></span> -<span class="line"><span style="color:#032F62">[p</span></span> -<span class="line"><span style="color:#032F62">'</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#032F62">'</span></span> -<span class="line"><span style="color:#032F62">_!</span></span> -<span class="line"><span style="color:#032F62">'</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">$b</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$x</span></span> -<span class="line"><span style="color:#D73A49">^</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$y</span></span> -<span class="line"><span style="color:#24292E">;</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$b</span></span> -<span class="line"><span style="color:#24292E">[</span><span style="color:#005CC5">1</span></span> -<span class="line"><span style="color:#24292E">]</span><span style="color:#D73A49">=</span></span> -<span class="line"><span style="color:#24292E">$c</span></span> -<span class="line"><span style="color:#24292E">(</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#005CC5">13</span></span> -<span class="line"><span style="color:#D73A49">*</span><span style="color:#005CC5">9</span></span> -<span class="line"><span style="color:#24292E">);</span></span> -<span class="line"><span style="color:#24292E">$s</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$r</span></span> -<span class="line"><span style="color:#24292E">(</span><span style="color:#005CC5">1</span></span> -<span class="line"><span style="color:#24292E">,(</span></span> -<span class="line"><span style="color:#005CC5">10</span></span> -<span class="line"><span style="color:#D73A49">**</span></span> -<span class="line"><span style="color:#005CC5">2</span><span style="color:#24292E">)</span></span> -<span class="line"><span style="color:#24292E">);</span></span> -<span class="line"><span style="color:#24292E">$w</span></span> -<span class="line"><span style="color:#24292E">(</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$s</span></span> -<span class="line"><span style="color:#24292E">,</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#005CC5">fn</span></span> -<span class="line"><span style="color:#24292E">(</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$i</span></span> -<span class="line"><span style="color:#24292E">)</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#D73A49">=></span></span> -<span class="line"><span style="color:#24292E">$p</span></span> -<span class="line"><span style="color:#24292E">((</span></span> -<span class="line"><span style="color:#24292E">(</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$i</span></span> -<span class="line"><span style="color:#D73A49">%</span><span style="color:#005CC5">3</span></span> -<span class="line"><span style="color:#D73A49">?</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#032F62">''</span></span> -<span class="line"><span style="color:#D73A49">:</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$f</span></span> -<span class="line"><span style="color:#24292E">)</span><span style="color:#D73A49">.</span></span> -<span class="line"><span style="color:#24292E">(</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$i</span></span> -<span class="line"><span style="color:#D73A49">%</span><span style="color:#005CC5">5</span></span> -<span class="line"><span style="color:#D73A49">?</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#032F62">''</span></span> -<span class="line"><span style="color:#D73A49">:</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$b</span></span> -<span class="line"><span style="color:#24292E">)</span><span style="color:#D73A49">?</span></span> -<span class="line"><span style="color:#D73A49">:</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$i</span></span> -<span class="line"><span style="color:#24292E">)</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#D73A49">.</span><span style="color:#032F62">'</span></span> -<span class="line"><span style="color:#032F62">'</span><span style="color:#24292E">)</span></span> -<span class="line"><span style="color:#24292E">);</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> + +<span style="color: #0550ae">$x</span> +<span style="color: #0550ae">=</span><span style="color: #6e7781"># +'i</span> +<span style="color: #953800">S</span><span style="color: #0a3069">' +;; +$y +='</span> +<span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #0550ae">!</span> +<span style="color: #0a3069">'; +$c +=# +$x +^# +$y +;# +$x +=# +'</span><span style="color: #24292f;background-color: #f6f8fa">x</span> +<span style="color: #953800">Om</span> +<span style="color: #0a3069">'; +$y +='</span> +<span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">!</span> +<span style="color: #24292f;background-color: #f6f8fa">o</span><span style="color: #0a3069">' +;# +$r +=# +$x +^# +$y +;# +$x +=# +'</span><span style="color: #24292f;background-color: #f6f8fa">k</span> +<span style="color: #953800">Sk</span> +<span style="color: #0550ae">~</span><span style="color: #24292f;background-color: #f6f8fa">}</span> +<span style="color: #953800">Ma</span> +<span style="color: #0a3069">'; +$y +='</span> +<span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #0550ae">!</span> +<span style="color: #24292f;background-color: #f6f8fa">s</span><span style="color: #0550ae">!</span> +<span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">!</span> +<span style="color: #0a3069">'; +$w +=# +$x +^# +$y +;# +$x +=# +'</span><span style="color: #24292f;background-color: #f6f8fa">z</span> +<span style="color: #953800">Hd</span> +<span style="color: #953800">G</span><span style="color: #0a3069">' +;# +$y +='</span> +<span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #0550ae">!</span> +<span style="color: #0550ae">~!</span> +<span style="color: #0a3069">'; +$p +=# +$x +^# +$y +;# +$x +=# +'</span><span style="color: #953800">L</span> +<span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">p</span> +<span style="color: #0a3069">'; +$y +='</span> +<span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #0550ae">!</span> +<span style="color: #0a3069">'; +$f +=# +$x +^# +$y +;# +$x +=# +'</span><span style="color: #953800">H</span> +<span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">p</span> +<span style="color: #0a3069">'; +$y +='</span> +<span style="color: #24292f;background-color: #f6f8fa">_</span><span style="color: #0550ae">!</span> +<span style="color: #0a3069">'; +$b +=# +$x +^# +$y +;# +$b +[1 +]= +$c +(# +13 +*9 +); +$s +=# +$r +(1 +,( +10 +** +2) +); +$w +(# +$s +,# +fn +(# +$i +)# +=> +$p +(( +(# +$i +%3 +?# +'' +:# +$f +). +(# +$i +%5 +?# +'' +:# +$b +)? +:# +$i +)# +.'</span> +<span style="color: #f6f8fa;background-color: #82071e">'</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +<span style="color: #24292f;background-color: #f6f8fa">);</span> +</code></pre> </div> </section> <section id="section--outro"> @@ -636,18 +648,19 @@ PHP では、バッククォートを使ってシェルを呼び出せる。これは <code>shell_exec</code> 関数と等価である。さて、PHP ではバックスラッシュによる行継続が使えないと書いたが、シェルでは使える (当然だが、呼び出されるシェルに依存する。Bash なら大丈夫だろう。知らんけど)。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49"><?</span><span style="color:#005CC5">php</span></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5">printf</span><span style="color:#24292E">(</span><span style="color:#032F62">`</span></span> -<span class="line"><span style="color:#032F62">e\</span></span> -<span class="line"><span style="color:#032F62">c\</span></span> -<span class="line"><span style="color:#032F62">h\</span></span> -<span class="line"><span style="color:#032F62">o\</span></span> -<span class="line"><span style="color:#032F62">\</span></span> -<span class="line"><span style="color:#032F62">1\</span></span> -<span class="line"><span style="color:#032F62">2\</span></span> -<span class="line"><span style="color:#032F62">3\</span></span> -<span class="line"><span style="color:#032F62">`</span><span style="color:#24292E">);</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> + +<span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #f6f8fa;background-color: #82071e">`</span> +<span style="color: #24292f;background-color: #f6f8fa">e</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #24292f;background-color: #f6f8fa">h</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #24292f;background-color: #f6f8fa">o</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #0550ae">1</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #0550ae">2</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #0550ae">3</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #f6f8fa;background-color: #82071e">`</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</code></pre> </div> <p> なお、ここでは簡単のため出力に <code>printf</code> をそのまま使っているが、実際には <code>printf</code> という文字列を合成して可変関数で呼び出す。 @@ -669,56 +682,59 @@ もうこれ以上は不可能だと思っていたのだが、この記事の執筆中に解決する方法を思いついたので載せておく。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49"><?</span><span style="color:#005CC5">php</span></span> -<span class="line"></span> -<span class="line"><span style="color:#24292E">$c </span><span style="color:#D73A49">=</span><span style="color:#032F62"> 'chr'</span><span style="color:#24292E">;</span></span> -<span class="line"></span> -<span class="line"><span style="color:#24292E">${</span></span> -<span class="line"><span style="color:#032F62">'_</span></span> -<span class="line"><span style="color:#032F62">'</span><span style="color:#24292E">}</span></span> -<span class="line"><span style="color:#D73A49">=</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#24292E">$c</span></span> -<span class="line"><span style="color:#24292E">(</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#005CC5">32</span></span> -<span class="line"><span style="color:#24292E">)</span><span style="color:#D73A49">.</span></span> -<span class="line"><span style="color:#24292E">$c</span></span> -<span class="line"><span style="color:#24292E">(</span><span style="color:#6A737D">#</span></span> -<span class="line"><span style="color:#005CC5">92</span></span> -<span class="line"><span style="color:#24292E">);</span></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5">printf</span><span style="color:#24292E">(</span><span style="color:#032F62">`</span></span> -<span class="line"><span style="color:#032F62">e\</span></span> -<span class="line"><span style="color:#032F62">c\</span></span> -<span class="line"><span style="color:#032F62">h\</span></span> -<span class="line"><span style="color:#032F62">o\</span></span> -<span class="line"><span style="color:#032F62">${</span></span> -<span class="line"><span style="color:#032F62">'_</span></span> -<span class="line"><span style="color:#032F62">'}</span></span> -<span class="line"><span style="color:#032F62">1\</span></span> -<span class="line"><span style="color:#032F62">2\</span></span> -<span class="line"><span style="color:#032F62">3\</span></span> -<span class="line"><span style="color:#032F62">`</span><span style="color:#24292E">);</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> + +<span style="color: #0550ae">$c</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'chr'</span><span style="color: #24292f;background-color: #f6f8fa">;</span> + +<span style="color: #f6f8fa;background-color: #82071e">$</span><span style="color: #24292f;background-color: #f6f8fa">{</span> +<span style="color: #0a3069">'_ +'</span><span style="color: #24292f;background-color: #f6f8fa">}</span> +<span style="color: #0550ae">=</span><span style="color: #6e7781"># +$c</span> +<span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #6e7781"># +32</span> +<span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">.</span> +<span style="color: #0550ae">$c</span> +<span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #6e7781"># +92</span> +<span style="color: #24292f;background-color: #f6f8fa">);</span> + +<span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #f6f8fa;background-color: #82071e">`</span> +<span style="color: #24292f;background-color: #f6f8fa">e</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #24292f;background-color: #f6f8fa">h</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #24292f;background-color: #f6f8fa">o</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #f6f8fa;background-color: #82071e">$</span><span style="color: #24292f;background-color: #f6f8fa">{</span> +<span style="color: #0a3069">'_ +'</span><span style="color: #24292f;background-color: #f6f8fa">}</span> +<span style="color: #0550ae">1</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #0550ae">2</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #0550ae">3</span><span style="color: #f6f8fa;background-color: #82071e">\</span> +<span style="color: #f6f8fa;background-color: #82071e">`</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</code></pre> </div> <p> 先程と同じく、<code>chr</code> や <code>printf</code> を生成する部分は長くなるので省いた。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span>${</span></span> -<span class="line"><span>'_</span></span> -<span class="line"><span>'}</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code>${ +'_ +'} +</code></pre> </div> <p> は変数で、中にはスペースとエスケープが入っている (<code>chr(32) . chr(92)</code>)。シェルに渡されている文字列は次のようになる。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span>e\</span></span> -<span class="line"><span>c\</span></span> -<span class="line"><span>h\</span></span> -<span class="line"><span>o\</span></span> -<span class="line"><span>\</span></span> -<span class="line"><span>1\</span></span> -<span class="line"><span>2\</span></span> -<span class="line"><span>3\</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code>e\ +c\ +h\ +o\ +\ +1\ +2\ +3\ +</code></pre> </div> <p> これは、前掲したコマンドと同じだ。かくして、スペースを陽に書かずにシェルをおおよそ自由に扱えるようになった。Fizzbuzz のワンライナーくらいすぐ書けるだろうから、あとはなんとかなるだろう (試してないけど)。 @@ -730,9 +746,10 @@ ちなみに、PHP 8.2 からは、この記法で Warning が出るようになるようだ。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span>${</span></span> -<span class="line"><span>'_</span></span> -<span class="line"><span>'}</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code>${ +'_ +'} +</code></pre> </div> <p> 最新版で警告が出るというのも美しくないので、私としては本編の解法を推す。 |
