Rakuで単語の文字をASCIIコードリストに簡潔に変換します



Convert Words Characters Into Its Ascii Code List Concisely Raku



解決:

それを機能させるためにここでできることがいくつかあります。

まず、取り組みましょう@ascii変数。 NS@ sigilは位置変数を示しますが、それに単一の文字列を割り当てました。これにより、1要素の配列が作成されます['abc ...']、これは将来的に問題を引き起こします。これをどの程度一般的にする必要があるかに応じて、配列を直接作成することをお勧めします。



私の@ ascii = ;私の@ ascii = 'a' .. 'z';私の@ ascii = 'abcdefghijklmnopqrstuvwxyz'.comb;

または先に進んで処理します任意の部分:

私の$ ascii-char = any ;私の$ ascii-char = any'a '..' z ';私の$ ascii-char = 'abcdefghijklmnopqrstuvwxyz'.comb.any;

ここで私は使用しました$ sigil、なぜならanyは実際にanyを指定します 独身 価値があるので、そのように機能します(これは私たちの生活を楽にします)。個人的に使います$ asciiですが、後の例をより区別しやすくするために別の名前を使用しています。



これで、map関数を処理できます。上記の2つのバージョンに基づくascii、map関数を次のいずれかに書き換えることができます

{push @ tmp、$ _。ordif $ _ eq @ ascii.any} {push @ tmp、$ _。ordif $ _ eq $ ascii-char}

使用したい場合は注意してください==、先に進んで、イニシャルに数値を作成できますアスキーの作成、そして使用$ _。ord。同様に、個人的には、マップされた変数に名前を付けるのが好きです。例:

{push @ tmp、$ ^ char.ord if $ ^ char eq @ ascii.any} {push @ tmp、$ ^ char.ord if $ ^ char eq $ ascii-char}

どこ$ ^ fooが置き換えられます$ _(複数使用する場合は、アルファベット順をにマップします@_ [0]、@_ [1]など)。



しかし、ここでもっと興味深い質問に取り掛かりましょう。事前に宣言することなく、これらすべてをどのように行うことができますか@tmp?明らかに、それはマップループで配列を作成することだけを必要とします。 ASCII値がない場合は注意が必要かもしれませんが、ifステートメントが返される空(または())実行されていない場合、人生は本当に簡単になります:

my @tmp = map {$ ^ char.ord if $ ^ char eq $ ascii-char}、 'wall'.comb; my @tmp = map {$ ^ char.ord if $ ^ char eq @ ascii.any}、 'wall'.comb;

'wáll'を使用した場合、リスト 集めました地図は119、空、108、108、これは自動的に 戻ってきた なので119、108、108。したがって、@tmpはちょうどに設定されています119、108、108。


はい、もっと簡単な方法があります。

'wall'.ords.grep(' az'.ords.minmax);

もちろん、これは依存していますからzは途切れのないシーケンスです。それの訳はminmaxは、リスト内の最小値と最大値に基づいてRangeオブジェクトを作成します。

それらが途切れのないシーケンスになかった場合は、ジャンクションを使用できます。

'wall'.ords.grep(' az'.ords.minmax | 'AZ'.ords.minmax);

しかし、あなたは他の言語と一致させたいと言いました。どちらが正規表現を叫びますか。

'wall' .comb.grep(/ ^&$ /).map(* .ord)

これは、ASCIIでもある小文字と一致します。

実際、私たちはそれをさらに簡単にすることができます。コームは、入力から取得する文字を決定する正規表現を取得できます。

'wall'.comb(/&/)。map(* .ord)#(119、97、108、108)'ΓΔαβγδε'.comb(/&/)。map(* .ord)#(945、946、 947、948、949)#ΓまたはΔは小文字ではないため、これらは含まれません

上記は、組み合わせアクセントがない場合にのみASCIIで機能することに注意してください。

'de  c [COMBINING ACUTE ACCENT] f'.comb(/&/)#(' d '、' f ')

アキュートアクセントの組み合わせは、ラテン語の小さな文字EWithAcuteを構成するe。その合成文字はASCIIではないため、スキップされます。

キャラクターの合成値がない場合はさらに奇妙になります。

'f  c [アキュートアクセントの組み合わせ]'。comb(/&/)#( 'f́'、)

それはfは小文字でASCIIです。ただし、構成するコードポイントは乗車のために持ち込まれます。

基本的に、データにアクセントが含まれている、または組み合わせられている可能性があり、データが破損する可能性がある場合は、バイナリ形式のままで処理することをお勧めします。

$ buf.grep:{。uniprop()eq'Ll '#&& .uniprop(' Block ')eq'基本ラテン語 '#ASCII}

上記は、1文字の文字列でも機能します。.unipropは、コードポイントを表す整数または実際の文字のいずれかで機能します。

'wall'.comb.grep:{。uniprop()eq' Ll '#&& .uniprop(' Block ')eq'基本ラテン語 '#ASCII}

これは文字列で機能するため、コードポイントの作成でも同じ問題が発生することに注意してください。

あなたも使用したいかもしれませんの代わりに.uniprop( 'Script')何をしたいかに応じて.uniprop( 'Block')。


これがRakuのを使用した実用的なアプローチですtransメソッド(Raku REPLで実行されるコードスニペット):

> my @a = 'wall'.comb; [w a l l]> @ a.trans( 'abcdefghijklmnopqrstuvwxyz' => ords( 'abcdefghijklmnopqrstuvwxyz'))。put; 119 97108108

上記では、ASCII文字列を処理します。以下に「é」文字を追加し、2段階の解決策を示します。

> my @ a = 'wallé'.comb; [wallé]> my @b = @ a.trans( 'abcdefghijklmnopqrstuvwxyz' => ords( 'abcdefghijklmnopqrstuvwxyz')); [11997108108é]> @ b.trans( 'é' => ords( 'é'))。put119 97108108233

注意事項#1:上記のコードはすべて正常に機能しますが、アルファベットを次のように短縮しようとすると'a' .. 'z'誤った戻り値が表示されることになりました...したがって、フルを使用します'abcdefghijklmnopqrstuvwxyz'。

注意事項#2:私の頭の中の1つの質問は、次の場合に出力を抑制しようとしていることです。トランスは文字を認識できません(例:「é」の最後の要素としての割り当てを抑制する方法上記の2番目のサンプルコードの@b)。追加してみました:引数を削除してトランスですが、運がありません。

編集: 不要な文字を削除するには、次のコードを使用しますgrep(àla@ Brad Gilbert)、続いてトランス:

> my @ a = 'wallé'.comb; [wallé]> @ a.grep( 'a' .. 'z'.comb.any).trans(' abcdefghijklmnopqrstuvwxyz '=> ords(' abcdefghijklmnopqrstuvwxyz '))。put 119 97108108