エリクサー-シギル

この章では、テキスト表現を操作するために言語によって提供されるメカニズムであるシジルについて説明します。印章はチルダ(〜)文字で始まり、その後に文字(印章を識別する)、区切り文字が続きます。オプションで、最後の区切り文字の後に修飾子を追加できます。

正規表現

Elixirの正規表現はシジルです。文字列の章でそれらの使用を見てきました。もう一度例を挙げて、Elixirで正規表現を使用する方法を見てみましょう。

# A regular expression that matches strings which contain "foo" or
# "bar":
regex = ~r/foo|bar/
IO.puts("foo" =~ regex)
IO.puts("baz" =~ regex)

上記のプログラムを実行すると、次の結果が生成されます-

true
false

印章は8つの異なる区切り文字をサポートします-

~r/hello/
~r|hello|
~r"hello"
~r'hello'
~r(hello)
~r[hello]
~r{hello}
~r<hello>

異なる区切り文字をサポートする理由は、異なる区切り文字が異なるシジルにより適している可能性があるためです。たとえば、正規表現に括弧を使用すると、正規表現内の括弧と混同される可能性があるため、混乱を招く可能性があります。ただし、次のセクションで説明するように、括弧は他のシジルに便利です。

Elixirは、Perl互換の正規表現をサポートし、修飾子もサポートします。正規表現の使用について詳しくは、こちらをご覧ください。

文字列、文字リスト、単語リスト

正規表現以外に、Elixirにはさらに3つのシジルが組み込まれています。シジルを見てみましょう。

文字列

〜s sigilは、二重引用符のように文字列を生成するために使用されます。〜s sigilは、たとえば、文字列に二重引用符と一重引用符の両方が含まれている場合に役立ちます。

new_string = ~s(this is a string with "double" quotes, not 'single' ones)
IO.puts(new_string)

この印章は文字列を生成します。上記のプログラムを実行すると、次の結果が生成されます-

"this is a string with \"double\" quotes, not 'single' ones"

文字リスト

〜c sigilは、charリストを生成するために使用されます-

new_char_list = ~c(this is a char list containing 'single quotes')
IO.puts(new_char_list)

上記のプログラムを実行すると、次の結果が生成されます-

this is a char list containing 'single quotes'

単語リスト

〜w sigilは、単語のリストを生成するために使用されます(単語は単なる通常の文字列です)。〜w印章の内部では、単語は空白で区切られています。

new_word_list = ~w(foo bar bat)
IO.puts(new_word_list)

上記のプログラムを実行すると、次の結果が生成されます-

foobarbat

〜wsigilは c, s そして a 結果のリストの要素のデータ型を指定する修飾子(それぞれcharリスト、文字列、およびアトム用)-

new_atom_list = ~w(foo bar bat)a
IO.puts(new_atom_list)

上記のプログラムを実行すると、次の結果が生成されます-

[:foo, :bar, :bat]

Sigilsでの補間とエスケープ

小文字のシジルに加えて、Elixirはエスケープ文字と補間を処理するために大文字のシジルをサポートしています。〜sと〜Sはどちらも文字列を返しますが、前者はエスケープコードと補間を許可しますが、後者は許可しません。これを理解するための例を考えてみましょう-

~s(String with escape codes \x26 #{"inter" <> "polation"})
# "String with escape codes & interpolation"
~S(String without escape codes \x26 without #{interpolation})
# "String without escape codes \\x26 without \#{interpolation}"

カスタムシジル

独自のカスタムシジルを簡単に作成できます。この例では、文字列を大文字に変換するための印章を作成します。

defmodule CustomSigil do
   def sigil_u(string, []), do: String.upcase(string)
end

import CustomSigil

IO.puts(~u/tutorials point/)

上記のコードを実行すると、次の結果が生成されます-

TUTORIALS POINT

まず、CustomSigilというモジュールを定義し、そのモジュール内にsigil_uという関数を作成しました。既存の印章スペースには既存の〜u印章がないので、それを使用します。_uは、チルダの後の文字としてuを使用することを示します。関数定義は、入力とリストの2つの引数を取る必要があります。