無題の備忘録

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件は後編に分ける。

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

right(String, Number) -> Right
right(String, Number, Character) -> Right

Types

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

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

Example:

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

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

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

rstr/2 関数 → find/3 関数

rstr(String, SubString) -> Index

Types

String = SubString = string()
Index = integer() >= 0

SubStringの最後の出現がStringで始まる位置(右側からみて最初に出現する位置)を返す。 SubStringがStringに存在しない場合、0を返す。

Example:

> string:rstr("foo, bar, baz", "ba"). 
11
> string:rstr("foo, bar, baz", "qu").
0

rstr/2関数の代わりに、find/3関数を使う。rstr/2では位置を返すが、find/3関数では残りの文字列を返す点に注意する。また、rstr/2 関数はSubStringが存在しない場合は0を返すが、find/3関数ではnomatchを返す。

> string:find("foo, bar, baz", "ba", trailing).
"baz"
> string:find("foo, bar, baz", "qu", trailing).
nomatch

span/2 関数 → take/2 関数

span(String, Chars) -> Length

Types

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

Stringの最大初期セグメントの長さを返す。これは、Charsの文字のみで構成される。つまり、連続してCharsの文字である文字数を返す。

Example:

> lists:seq($a,$z).
"abcdefghijklmnopqrstuvwxyz"
> string:span("abcdef123456", lists:seq($a,$z)).
6

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

> {L, T} = string:take("abcdef123456", lists:seq($a,$z)).
{"abcdef","123456"}
> string:length(L).
6

str/2 関数 → find/2 関数

str(String, SubString) -> Index

Types

String = SubString = string()
Index = integer() >= 0

SubStringの最初の出現がStringで始まる位置(左側からみて最初に出現する位置)を返す。 SubStringがStringに存在しない場合、0を返す。

This function is obsolete. Use find/2.

Example:

> string:str("foo, bar, baz", "ba").  
6
> string:str("foo, bar, baz", "qu"). 
0

str/2関数の代わりに、find/2, find/3関数を使う。str/2では位置を返すが、find/2, find/3関数では残りの文字列を返す点に注意する。また、str/2 関数はSubStringが存在しない場合は0を返すが、find/2, find/3関数ではnomatchを返す。

> string:find("foo, bar, baz", "ba").          
"bar, baz"
> string:find("foo, bar, baz", "ba", leading).
"bar, baz"
> string:find("foo, bar, baz", "qu").         
nomatch

strip/1, strip/2, strip/3 関数 → trim/3 関数

strip(String :: string()) -> string()
strip(String, Direction) -> Stripped
strip(String, Direction, Character) -> Stripped

Types

String = Stripped = string()
Direction = left | right | both
Character = char()

先頭(leading)または末尾(trailing)、あるいはその両方(both)から、空白、またはいくつかの文字が削除された文字列を返す。 Directionは左(left)、右(right)、またはその両方(both)が指定でき、空白を削除する方向を示す。strip/1strip(String,both) と同等。

Example:

> string:strip("   Hello   ").
"Hello"
> string:strip("   Hello   ", right).
"   Hello"
35> string:strip("...Hello.....", both, $.).
"Hello"

strip/1, strip/2, strip/3 関数の代わりに、trim/1, trim/2, trim/3 関数を使う。strip/3の第3引数はchar()型だが、trim/3の第3引数は[grapheme_cluster()]で形式が異なるので注意する。

> string:trim("   Hello   ").        
"Hello"
> string:trim("   Hello   ", trailing).
"   Hello"
> string:trim("...Hello.....", both, "."). 
"Hello"

sub_string/2, sub_string3 関数 → slice/3 関数

sub_string(String, Start) -> SubString
sub_string(String, Start, Stop) -> SubString

Types

String = SubString = string()
Start = Stop = integer() >= 1

位置StartからStringの終わりまで、または位置StopまでのStringの部分文字列を返す。

Example:

> string:sub_string("foo, bar, baz", 6).
"bar, baz"
> string:sub_string("foo, bar, baz", 6, 8).
"bar"

sub_string/2, sub_string3 関数の代わりに、slice/2, slice/3 関数を使う。sub_string関数の第2引数は指定した位置を部分文字列に含むが、slice関数の第2引数は指定した位置は部分文字列に含まない。また、sub_string関数の第3引数は位置を指定するが、slice関数の第3引数は返す文字列の長さを指定する。

> > string:slice("foo, bar, baz", 5).   
"bar, baz"
> string:slice("foo, bar, baz", 5, 3).
"bar

substr/2, substr/3 関数 → slice/3 関数

substr(String, Start) -> SubString
substr(String, Start, Length) -> SubString

Types

String = SubString = string()
Start = integer() >= 1
Length = integer() >= 0

位置Startから始まり、文字列の末尾までまたは長さLengthまでのStringの部分文字列を返す。

Example:

> string:substr("foo, bar, baz", 6).
"bar, baz"
> string:substr("foo, bar, baz", 6, 3).
"bar"

substr/2, substr3 関数の代わりに、slice/2, slice/3 関数を使う。substr関数の第2引数は指定した位置を結果に含むが、slice関数の第2引数は指定した位置は結果に含まない。

> string:slice("foo, bar, baz", 5).   
"bar, baz"
> string:slice("foo, bar, baz", 5, 3).
"bar

sub_word/2, sub_word/3 関数 → nth_lexeme/3 関数

sub_word(String, Number) -> Word
sub_word(String, Number, Character) -> Word

Types

String = Word = string()
Number = integer()
Character = char()

文字列の位置Numberにある単語を返す。 単語は空白または文字で区切られる。

Example:

> string:sub_word("foo, bar, baz", 1).
"foo,"
> string:sub_word("foo, bar, baz", 2).
"bar,"
> string:sub_word("foo, bar, baz", 1, $,).
"foo"
> string:sub_word("foo, bar, baz", 2, $,).
" bar"

sub_word/2, sub_word/3 関数の代わりに、nth_lexeme/3 関数を使う。sub_word関数では第3引数はchar()型だが、nth_lexeme関数では[grapheme_cluster()]で形式が異なるので注意する。

> string:nth_lexeme("foo, bar, baz", 1, "\s").
"foo,"
> string:nth_lexeme("foo, bar, baz", 2, "\s").
"bar,"
> string:nth_lexeme("foo, bar, baz", 1, ",").
"foo"
> string:nth_lexeme("foo, bar, baz", 2, ",").
" bar"

to_lower/1, to_upper/1 関数 → lowercase/1, uppercase/1, titlecase/1 or casefold/1 関数

to_lower(String) -> Result
to_lower(Char) -> CharResult
to_upper(String) -> Result
to_upper(Char) -> CharResult

Types

String = Result = io_lib:latin1_string()
Char = CharResult = char()

指定された文字列または文字は大文字と小文字が変換される。サポートされている文字セットは ISO/IEC 8859-1(Latin1とも呼ばれる)。 この文字セット以外のすべての値は変更されない。

Example:

> $H.
72
> $h.
104
> string:to_lower($H).    
104
> string:to_upper($h).  
72
> string:to_lower("HELLO").
"hello"
> string:to_upper("hello").
"HELLO"

to_lower/1, to_upper/1 関数の代わりに、lowercase/1, uppercase/1 関数を使う。その他、最初の文字を大文字にしたい場合は titlecase/1 関数を使う。また、大文字小文字を区別しないで文字列を比較したい場合は casefold/1 関数を使う。

> string:lowercase("h").
"h"
> string:uppercase("H").
"H"
> string:lowercase("HELLO").
"hello"
> string:uppercase("hello").
"HELLO"

tokens/2 関数 → lexemes/2 関数

tokens(String, SeparatorList) -> Tokens

Types

String = SeparatorList = string()
Tokens = [Token :: nonempty_string()]

SeparatorListの文字で区切られた文字列のトークンのリストを返す。

Example:

> string:tokens("foo, bar, baz", ",").      
["foo, ba",", baz"]

tokens/2 関数の代わりに、lexemes/2 関数を使う。

> string:lexemes("foo, bar, baz", "r").
["foo, ba",", baz"]

words/1, words/2 関数 → lexemes/2 関数

words(String) -> Count
words(String, Character) -> Count

Types

String = string()
Character = char()
Count = integer() >= 1

空白または文字で区切られた文字列の単語数を返す。

Example:

> string:words("foo, bar, baz").     
3
> string:words("foo, bar, baz", $r).
2

words/1, words/2 関数の代わりに、lexemes/2 関数を使う。worrd関数は単語数を返すが、lexemes関数は文字で区切った文字列のリストを返す。また、第3引数の形式が異なるので注意する。

> N1 = string:lexemes("foo, bar, baz", "\s").
["foo,","bar,","baz"]
> length(N1).       
3
> N2 = string:lexemes("foo, bar, baz", "r").
["foo, ba",", baz"]
> length(N2).
2