文字列
アセンブラの魔女 ⧫ Perl ⧫ 文字列
アセンブラの魔女 ⧫ Perl ⧫ 文字列
文字列の長さを調べる
文字列の連結
split(文字列の分割)
substr(部分文字列の取得/置換)
文字列がパターにマッチするか調べる
パターンマッチ演算子の区切り文字を変更する方法
正規表現
置換演算子を使った置換
正規表現に変数を使う方法

 文字列の長さを調べるにはlength関数を使います。

$lenth = $lenth( $str );

 Perlでは連結演算子「.」や「.=」を使って簡単に文字列を連結することができます。以下の書式では.演算子を使って$string_in_1の後に$string_in_2を連結して、$string_outに代入します。

$string_out = $string_in_1 . $string_in_2

 以下の書式では.=演算子を使って$string_in_1の後に$string_in_2を連結します。

$string_1 .= $string_in_2

 split関数を使うと、指定した区切り文字で文字列を分解することができます。

split( [ /pattern/ [, expr [, limit ] ] ] )

 patternには区切り文字を正規表現で指定します。patternを省略すると1個以上の空白文字を区切り文字とします。exprには入力とする文字列を指定します。exprを省略すると$_が入力として参照されます。limitを使って分割数の最大数を指定することもできます。split関数は分割した文字列をリストで返します。

@color = split(/&/, 'red&green&blue' );
print "$color[ 0 ]\n";
print "$color[ 1 ]\n";
print "$color[ 2 ]\n";

 上記のコードを実行すると、文字列'red&green&blue'は分解されて配列colorに取り込まれ、printによって以下のように出力されます。

red
green
blue

 次の例はkey=value形式のデータを「&」で連結した文字列から、split関数を使って「&」を区切り文字にkey=value形式のデータに分割して配列query_にセットします。次に配列query_のそれぞれの要素(key=value形式のデータ)に対してsplit関数を使って「=」を区切り文字としてkeyとvalueに分割してそれぞれ、変数$keyと$varにセットします。さらに、$keyと$varから連想配列$optionsを作ります。

my $request = 'color=green&width=640&height=480';
my @query_ = split(/&/, $request );
my ( $key, $var, $options );
foreach ( @query_ )
{
    ( $key, $val ) = split( /=/, $_ );
    $options{ $key } = $val;
}

print "color = $options{ 'color' }\n";
print "width = $options{ 'width' }\n";
print "height = $options{ 'height' }\n";

 substr関数を使って部分文字を取得したり置換することができます。

substr( string, offset [, length [, replacement] ] )

 stringには入力文字を指定します。offsetには取得または置換する文字の開始を文字列の先頭からの文字数(最初の文字をゼロとします)を指定します。 lengthには置換する文字の文字数を指定します。省略した場合は文字列の最後までが対象となります。replacementには、offsetとlengthに置き換える文字列を指定します。このパラメータを指定した場合、置換結果はstringに上書きされます。この関数はoffsetとlengthで指定された範囲の部分文字列を返します。

 正規表現とパターンマッチ演算子を使って、文字列が特定のパターンにマッチするか(マッチしないか)調べることができます。パターンマッチ演算子は正規表現を2つのスラッシュで囲んで表現します。

/pattern/

 これを条件式として用いるには、以下のように=~演算子や!~演算子も使います。

string =~ /pattern/     # 文字列stringが正規表現patternにマッチする場合に真
string !~ /pattern/     # 文字列stringが正規表現patternにマッチしない場合に真

 以下の例では、比較に=~演算子を使っています。$aの先頭が「.」のときパターンマッチしますので、ifステートメントのブロックが実行されます。

if ( $a =~ /^\./ )
{
...
}

 =~演算子には簡略化された書式もあります。=~演算子は比較対照の文字列が指定されない場合、変数$との照合を行いますので、(あらかじめ変数$_に文字列がセットされていれば)以下のような書き方ができます。

if ( /^\./ )
{
...
}

 パターンマッチ演算子は通常スラッシュを区切り文字としていますが、パス名を扱う場合などに使いにくいことがあります。このような場合、以下の書式を使って区切り文字を別の文字に置き換えることもできます。

m新しい区切り文字pattern新しい区切り文字

 たとえば、以下はパス名の一部との照合を行う例ですが、スラッシュの代わりに#を区切り文字としています。

m#/usr/local#

 Perlでは拡張された正規表現が用いられます。

 正規表現  意味
\tタブ (0x09)
\n改行 (0x0a)
\r復行 (0x0d)
\fホームフィード (0x0d)
^行頭
$行末
.任意の1文字
\w英数字(_を含む)
\w英数字(_を含む)
/W非英数字
\s空白文字
\S非空白文字
\d数字
\D非数字
\b語境界文字(文字クラスの中以外)
\B語境界文字以外
\b後退(0x08)(文字クラスの中のみ)
[]文字クラス指定
\nnn8進数表現(nは0~7)
* 0回以上の繰り返し
+ 1回以上の繰り返し
{m,n}m回からn回の繰り返し
? 0回または1回
| 選択
()くくり出し

 括弧()内の正規表現にマッチした部分文字列は、その後パターン内では\1, \2で参照され、パターン外では$1, $2で参照することができます。たとえば、次の例では同じ部分文字列が2回出現すると真となります。

/(.+).*\1/

 次の例では先頭の2文字を交換します。

s/^(.)(.)(.*)$/$2$1$3/
 置換演算子を使うことで、簡単に文字列の一部を置換することができます。
$value =~ s/PATTERN/REPLACE/OPTION

 文字列 $value中のPATTERNにマッチする部分がREPLACEに置換されます。OPTIONは省略可能ですが、次のようなオプションを追加することができます(他にもいくつかのオプションがあります)。

gPATTERNにマッチするものすべてを置換
i大文字、小文字を区別しない

 次の例は文字列$str中の<br>タグを除去します。gオプションが用いられていますので、$str中に複数の<br>タグが含まれていた場合でも一括して除去されます。

$str =~ s/\<br\>/ /g;

 正規表現中で変数を使うには、変数表記の$以降を{}で括ります。

${variable};

 次の例のように配列の添え字に変数を使うこともできます。

if ( $author =~ /${array[${j}]}/ )
{
  ..
}
▼ Property
記事情報
datePublished2011-01-01
dateModified2018-07-25
authorアセンブラの魔女
headlinePerlの文字列に関する記事です
keywordsPerl
keywords文字列
keywords文字列の長さ
keywords連結
keywords分割
keywordssplit
keywords部分文字列
keywordssubstr
keywordsパターンマッチ
keywords正規表現
keywords置換演算子
publisher name= wiredFish, logo.name= wiredFish, logo.url= https://books-nekoya.jp/Programming/chigu-hagu-title-01.png size= 208 pixel x 50 pixel
image.url url= https://books-nekoya.jp/Programming/chigu-hagu-title-01.png , size= 208 pixel x 50 pixel