1. ホーム
  2. スクリプト・コラム
  3. パール

Perlは先頭と末尾の空白を削除します(左右の空白文字、空白文字を削除します)。

2022-01-08 09:45:14

他のプログラミング言語には、文字列の先頭と末尾からそれぞれスペースとタブを削除する関数ltrimとrtrimがあるものもあります。Perlにはそのような関数はありません。なぜなら、単純な正規表現による置換で十分だからです(ただし、CPANにはそのような関数を実装したモジュールが数多く存在すると思います)。実際、Parkinsonの些細な定理で顕著なテーマになっているほど簡単なことなのだ。

左側仕上げ

ltrim または lstrip は、文字列の左側から空白文字を削除します。

コピーコード コードは以下の通りです。

$str =~ s/^\s+//;

文字列^の先頭から1文字以上の空白文字( \s+ )にマッチし、空白文字に置き換えます。

右側照合順序

rtrim または rstrip は、文字列の右側から空白文字を削除します。

コピーコード コードは以下の通りです。

$str =~ s/\s+$//;

文字列の末尾($)までの空白文字( \s+ )にマッチし、NULL文字に置き換えます。

両端を片付ける

は、文字列の両端から空白文字を削除します。

コピーコード コードは以下の通りです。

$str =~ s/^\s+|\s+$/g

上の2つの正規表現をor記法|で連結し、最後に/gをつけると、グローバルに(複数回)置換操作を行うことができます。

関数でラップする

これらの構造をコードで見たくない場合は、これらの関数をコードに追加してください。

コピーコード コードは以下の通りです。

sub ltrim { my $s = shift; $s =~ s/^\s+//; return $s };
sub rtrim { my $s = shift; $s =~ s/\s+$//; return $s };
sub trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s };

このように使用します。
コピーコード コードは以下の通りです。

my $z = " abc ";
printf "<%s>\n", trim($z); # <abc>
printf "<%s>\n", ltrim($z); # <abc >
printf "<%s>\n", rtrim($z); # < abc >
String::Util

文字列::ユーティリティ

どうしてもコピーしたくないなら、モジュールをインストールすればいい。

例えば、String::Utilにはtrimという関数があり、以下のように使うことができます。

コピーコード コードは以下の通りです。

use String::Util qw(trim);

my $z = " abc ";
printf "<%s>\n", trim( $z ); # <abc>
printf "<%s>\n", trim( $z, right => 0 ); # <abc >
printf "<%s>\n", trim( $z, left => 0 ); # < abc >


デフォルトでは辺を照合してくれるので、パラメータを用意する必要はありません。ltrimとrtrimは自分で実装した方がわかりやすいと思います。

テキスト::トリム

もうひとつのモジュール、Text::Trimは3つの機能を提供しますが、ちょっと危険なほど、極端にPerl風の書き方をしていますね。

これを呼び出して、print文の中で戻り値を使ったり、変数に代入すると、照合済みの文字列が返され、元の文字列は変更されないままです。

コピーコード コードは以下の通りです。

use Text::Trim qw(trim);

my $z = " abc ";
printf "<%s>\n", trim($z); # <abc>
printf "<%s>\n", $z; # < abc >


一方、空白のコンテキストで、つまり戻り値なしで呼び出すと、trim関数は引数を変更し、chompのような挙動をします。
コピーコード コードは以下の通りです。

use Text::Trim qw(trim);

my $z = " abc ";
trim $z;
printf "<%s>\n", $z; # <abc>