無題の備忘録

IT技術について調べたことや学んだこと、試したこと記録するブログです。Erlang、ネットワーク、 セキュリティ、Linux関係のものが多いです。

Erlang の string モジュールの古い非推奨の関数から代わりの関数へ移行する - 前編

OTP 20.0 で string モジュールに多くの関数が追加されていたのに、最近気がついた。

string モジュールのおさらいをしたい人は下記の記事へ

stacktrace.hatenablog.jp

下記のリストに記載した関数は古いAPIで非推奨になっている。それぞれ代わりになる新しいAPIがあるのでそちらへ移行する。 また、これらの古いAPIはLatin-1文字のリストでのみ機能することに注意する。

  • cenre/2, centre/3 関数
  • chars/2, chars/3 関数
  • chr/2 関数
  • concat/2 関数
  • copies/2 関数
  • cspan/2 関数
  • join/2 関数
  • left/2, left/3 関数
  • len/1 関数
  • rchr/2 関数
  • right/2, right/3 関数
  • rstr/2 関数
  • span/2 関数
  • str/2 関数
  • strip/1, strip/2, strip/3 関数
  • sub_string/2, sub_string3 関数
  • substr/2, substr/3 関数
  • sub_word/2, sub_word/3 関数
  • to_lower/1, to_upper/1 関数
  • tokens/2 関数
  • words/1, words/2 関数

最初の10件は前編に、残りの11件は後編に分ける。

cenre/2, centre/3 関数 → pad/3 関数

centre(String, Number) -> Centered
centre(String, Number, Character) -> Centered

Types

String = Centered = string()
Number = integer() >= 0
Character = char()

文字列が中央に配置されたものを返す。空白または Character で囲まれる。返り値の文字列の長さはNumberになる。

Example:

> string:centre("Hello", 9). 
"  Hello  "
> string:centre("Hello", 10).
"  Hello   "
> string:centre("Hello", 5).
"Hello"
> string:centre("Hello", 4).
"Hell"

centre/2, centre/3 関数の代わりに、pad/3関数を使う。 pad/3関数なら下記のような感じで置き換える。ただし、centre 関数では length(String) > Numberの場合、Centered は Number に切り詰められたが、pad関数では切り詰められない。

>lists:flatten(string:pad("Hello", 8, both)).
" Hello  "
> lists:flatten(string:pad("Hello", 4, both)).
"Hello"

chars/2, chars/3 関数 → lists:duplicate/2 関数

chars(Character, Number) -> String
chars(Character, Number, Tail) -> String

Types

Character = char()
Number = integer() >= 0
Tail = String = string()

Number文字のCharacterで構成される文字列を返す。オプションで、Stringの末尾を文字列のTailにつけることができる。

Example:

> string:chars($a, 5).
"aaaaa"

chars/2, chars/3 関数の代わりに、lists:duplicate/2関数を使う。 lists:duplicate/2 関数なら下記のような感じで置き換える。

> lists:duplicate(5,"a").                
["a","a","a","a","a"]
> lists:flatten(lists:duplicate(5,"a")).
"aaaaa"

chr/2 関数 → find/2 関数

chr(String, Character) -> Index

Types

String = string()
Character = char()
Index = integer() >= 0

String内でCharacterが最初に現れるインデックスを返す。Characterが存在しない場合は0を返す。

Example:

> string:chr("foo, bar, baz", $b).
6
> string:chr("abcdef", $q).
0

chr/2 関数の代わりに、find/2関数を使う。

find/2 関数は下記のような実行結果を得る。この関数ではインデックスではなく、文字が最初に現れたところから末尾まで文字列を得るので注意する。また、検索文字が存在しない場合は、0ではなくnomatchを返す。

> string:find("foo, bar, baz", "b").
"bar, baz"
> string:find("foo, bar, baz", "q").
nomatch

concat/2 関数 → [String1、String2]をフラット化

concat(String1, String2) -> String3

Types

String1 = String2 = String3 = string()

String1とString2を連結して、新しい文字列String3を形成して返す。

Example:

> string:concat("abcde", "12345"). 
"abcde12345"

concat/2 関数の代わりに、[String1、String2]を引数Dataとして、unicode:characters_to_list/2またはunicode:characters_to_binary/2を呼び出して出力をフラット化する。

> unicode:characters_to_list(["abcde", "12345"], latin1).
"abcde12345"
> unicode:characters_to_list(["あいうえお", "12345"], unicode).
"あいうえお12345"

copies/2 関数 → lists:duplicate/2 関数

copies(String, Number) -> Copies

Types

String = Copies = string()
Number = integer() >= 0

Number回繰り返された文字列を含む文字列を返す。

> string:copies("ab", 5).                              
"ababababab"

copies/2 関数の代わりに、lists:duplicate/2関数を使う。 lists:duplicate/2 関数なら下記のような感じで置き換える。lists:duplicate/2の返り値はリストなので、lists:flatten/1でフラット化してみた。

> lists:duplicate(5,"ab").               
["ab","ab","ab","ab","ab"]
> lists:flatten(lists:duplicate(5,"ab")).
"ababababab"

cspan/2 関数 → take/3 関数

cspan(String, Chars) -> Length

Types

String = Chars = string()
Length = integer() >= 0

Stringの最大初期セグメントの長さを返す。これは、Chars以外の文字のみで構成される。つまり、Chars の文字が最初に出てきてくるまでの文字数を返す。

Example:

> string:cspan("foo, bar, baz", "b").      
5

cspan/2 関数の代わりに、take/3 関数を使う。文字数そのものが得られるわけではないので注意する。

> {Leading, Trailing} = string:take("foo, bar, baz", "b", true).
{"foo, ","bar, baz"}
> string:length(Leading).
5

join/2 関数 → lists:join/2 関数

join(StringList, Separator) -> String

Types

StringList = [string()]
Separator = String = string()

Separatorの文字列で区切られたStringListの要素を含む文字列を返す。

Example:

> string:join(["one", "two", "three"], ", ").
"one, two, three"

join/2 関数の代わりに、lists:join/2関数を使う。 lists:join/2 関数なら下記のような感じで置き換える。第1引数と第2引数が string:join/2と逆なので注意する。

> lists:join(", ", ["one", "two", "three"]).
["one",", ","two",", ","three"]
> > unicode:characters_to_list(lists:join(", ", ["one", "two", "three"])). 
"one, two, three"

left/2, left/3 関数 → pad/2, pad/3 関数

left(String, Number) -> Left
left(String, Number, Character) -> Left

Types

String = Left = string()
Number = integer() >= 0
Character = char()

Numberに従って長さが右側方向に調整されたStringを返す。 左側方向は固定されている。 length(String) < Numberの場合、Stringには空白またはCharacterが埋め込まれる。

Example:

> string:left("Hello",10).   
"Hello     "
> string:left("Hello",10,$.).
"Hello....."

left/2, left/3 関数の代わりに、pad/2, pad/3, pad/4 関数を使う。 pad/2, pad/3, pad/4 の返り値はunicode:charlist()なので unicode:characters_to_list/1でフラット化した。

> string:pad("Hello", 10).
["Hello",32,32,32,32,32]
> string:pad("Hello", 10, trailing, ".").
["Hello",".",".",".",".","."]
> unicode:characters_to_list(string:pad("Hello", 10)).
"Hello     "
> unicode:characters_to_list(string:pad("Hello", 10, trailing, ".")).
"Hello....."

len/1 関数 → length/1 関数

len(String) -> Length

Types

String = string()
Length = integer() >= 0

String の文字数を返す.

Example:

> string:len("abcde").
5

len/1 関数の代わりに、length/1関数を使う。そのまま置き換えられる。

> string:length("abcde"). 
5

rchr/2 関数 → find/3 関数

rchr(String, Character) -> Index

Types

String = string()
Character = char()
Index = integer() >= 0

String内のCharacterが最後に出現したインデックスを返す。 Characterが存在しない場合は0を返す。

Example:

> string:rchr("foo, bar, baz", $b).
11
> string:rchr("foo, bar, baz", $q).
0

chr/2 関数は前方から検索したのに対して、rchr/2関数は後方から検索するもの。rchr/2関数の代わりは、find/3関数を使う。

find/3 関数は下記のような実行結果を得る。この関数ではインデックスではなく、文字を末尾(trailing)から検索して、最初に現れたところから末尾まで文字列を得るので注意する。また、検索文字が存在しない場合は、0ではなくnomatchを返す。

> string:find("foo, bar, baz", "b", trailing).
"baz"
> string:find("foo, bar, baz", "q", trailing).
nomatch

他の記事へ

stacktrace.hatenablog.jp

stacktrace.hatenablog.jp

stacktrace.hatenablog.jp