"0123" ); # "3200212\n" Perl 5またはU...">

Perl6での音訳

「音訳」とは、文字の置き換えを意味します。 これは、まさにStr.transメソッドが行うことです。



say "GATTACA".trans( "TCAG" => "0123" ); #  "3200212\n"
      
      







Perl 5またはUnixシェルに精通している人は、これでtr / tcag / 0123 /を認識します。残りについては、各文字Tを0に、各Cを1に、などと説明します。 TCAGと0123の2行は、交換する必要があるアルファベットを提供します。



これは、さまざまな操作を実装する際の速度に使用できます。 たとえば、 ROT-13メソッドを使用してテキストを「暗号化」する単純な関数(文字を13の位置にある文字に置き換える):



 sub rot13($text) { $text.trans( "A..Za..z" => "N..ZA..Mn..za..m" ) }
      
      







.transは範囲を開示します...したがって、「n..z」は「nopqrstuvwxyz」を意味します。 したがって、関数rot13は、ASCIIアルファベットの特定の部分を他の部分に置き換えます。



Perl 5では、2つのドットの代わりにダッシュが使用されます-しかし、Perl 6では、言語、正規表現、および音訳で、2つのドットが「ギャップ」の概念をよりよく表すと判断しました。



.transメソッドは$ textを変更せず、新しい値のみを返します。 これはPerl 6の慣習です-副作用のないメソッドを提供しています。 ただし、必要に応じて、この動作を定義できます。



 $kabbala.=trans("A..Ia..i" => "1..91..9");
      
      







これは他のすべての方法で機能します。 それでも、プログラマーは最初の方法をサポートするライブラリを作成することをお勧めします。そうすれば、私たちの世界はより明るく、より良くなります。



しかし、潜在力の.transがプライムtr ///を超えることなく、それはPerl 6ではありません。 ここに彼がまだやっていることがあります。



HTMLのいくつかの文字をエスケープする必要があるとします。つまり、リストに従ってそれらを置き換えます。



  & => & < => < > => >
      
      







常連に制限することができます。 しかし、このステップで無限ループに陥る可能性があります(&=>&=>&amp; => ...)。 しかし、問題はそれでさえありませんが、より高いレベルでタスク全体をカバーするのではなく、ストリングの断片を縫うことに従事することです。 さらに、このメソッドを次のように動作させたいと思います。



   =>   => 
      
      







最初の交換が最初に実行された場合、2番目の交換には何も残りません。結果は不正確になります。 通常、最初に長い行を変更する必要があります。



そして、この振る舞いはPerl 6で.transを提供します。これは彼の隠された武器です-数個のストリングではなく、数個の配列を渡します。 文字をエスケープするには、次を指定するだけです。



 my $escaped = $html.trans( [ '&', '<', '>' ] => [ '&amp;', '&lt;', '&gt;' ] );
      
      







そして、永遠のサイクルに陥ることなく、正しい順序でシンボルを置き換えるという、これらの些細ではないが退屈なタスクはすべて私たちのために解決されます。



All Articles