
Perlのsubstr関数とは?文字列を切り出すためのsubstr関数の使い方
substr関数は、指定した位置から部分文字列を切り出す時に使用します。正規表現や配列に文字列を格納する方法など、Perlで文字列を操作する方法はたくさんありますが、文字列内の特定の場所を切り出す、あるいは置換する場合は、substr関数を利用すると便利です。
目次
1.基本的な使い方
substr関数の基本構文は下記の通りです。
基本構文
substr (EXPR , OFFSET [, LENGTH] [, REPLACEMENT])
文字列(EXPR)を元に、文字列の位置(OFFSET)から数えて 文字数(LENGTH)分の部分文字列を抜き出して返します。文字列の先頭は『OFFSET = 0』となります。もしOFFSETが負の値だった場合、文字列の最後から数えた OFFSET の位置が『開始位置』です。LENGTHが省略された場合、開始位置から文字列の最後までを返します。もし LENGTH が負の値であれば、文字列の最後から LENGTH で指定した文字数分を除いた部分文字列を返します。文字列(REPLACEMENT)を指定すると、EXPRの取り出された部分をREPLACEMENTで置換します。
【参考】
文字列の位置(OFFSET)は下記の図のような数値で指定されます。文字列操作では操作開始位置であるOFFSET値が重要になりますので、しっかり理解しましょう。
では、いくつかサンプルを使って動作を確認してみましょう。
2.使用例
2-1.OFFSET値:正、LENGTH値:正の場合
サンプル1 my $string = 'abcdefg'; print substr($string, 3, 2); [実行結果] de
このカタチが一般的な使用方法であると思います。‘abcdefg’という文字列の3番目の位置(OFFSET)から2文字分の長さ(LENGTH)を切り取ります。従って部分文字列として‘de’が返されます。
2-2.OFFSET値:負、LENGTH値:正の場合
サンプル2 my $string = 'abcdefg'; print substr($string, -4, 3); [実行結果] def
この場合、開始位置(OFFSET)が負の値-4ですから、最後から数えて4番目の位置から3文字分の文字列が切り出されます。従って、返される部分文字列は‘def’となります。
2-3.OFFSET値:正、LENGTH値:省略の場合
サンプル3 my $string = 'abcdefg'; print substr($string, 3); [実行結果] defg
切り出す長さ(LENGTH)が省略されている場合、3番目の位置(OFFSET)から最後までが切り出す対象になります。返される部分文字列は‘defg’です。
2-4.OFFSET値:正、LENGTH値:負の場合
サンプル4 my $string = 'abcdefg'; print substr($string, 3, -2); [実行結果] de
この場合、開始位置(OFFSET)が3ですから、まず3番目の‘d’から最後までの文字列‘defg’を対象と考えます。そして切り取る長さ(LENGTH)が-2ですから、先ほど対象とした‘defg’の最後から2文字分を取り除き、残った文字列‘de’を返します。
2-5.置換する場合(その1)
サンプル5 my $string = 'abcdefg'; print substr($string, 3, 2, 'DE'); print $string; [実行結果] de abcDEfg
最後にsubstr関数で置換するやり方です。まず開始位置(OFFSET)が3ですから、3番目の位置から2文字分の長さ(LENGTH)を切り取った文字列‘de’が返されます。次に置換する文字列(REPLACEMENT)が指定されていますから、元の文字列‘abcdefg’から切り取った文字列‘de’の部分を、置換する文字列‘DE’に置き換えます。substr関数の戻り値は‘de’、元の文字列‘abcdefg’が‘abcDEfg’に置換される点に注意しなければなりません。また置換された文字列‘abcDEfg’は、スクリプトが終了するまで保持されます。
2-6.置換する場合(その2)
サンプル6 my $string = 'abcdefg'; substr($string, 3, 2) = 'DE'; print $string; [実行結果] abcDEfg
substr関数を使用したもう一つの置換の方法として、左辺値への代入の対象とすることで部分文字列の置き換えや追加などが可能となります。
3.さいごに
このように、substr関数を使えば簡単に文字列の一部を切り出すことができます。これらのサンプルを元に、みなさんも多様な文字列処理に活用してみてください。
コメント