Go to the first, previous, next, last section, table of contents.


クォートとクォートのような演算子

クォートはリテラル値であると考えるのが普通ですが、Perl において、クォー トは演算子として働き、さまざまな展開やパターンマッチの機能を持っています。 そのような動作をさせるのに、Perl は慣習的にクォート文字を使っていますが、 どの種類のクォートも、自分でクォート文字を選べるようになっています。以下 の表では、{} がその選んだ区切文字のペアを示しています。選んだ区切文字が 括弧の類でない場合には、前後の文字として同一のものを使いますが、4 つの括 弧 ((), <>, [], {}) の場合にはネストできます。

通常記法  汎用記法      意味         展開
==========================================
   ''       q{}       リテラル       不可
   ""      qq{}       リテラル        可
   ``      qx{}       コマンド        可
           qw{}      単語リスト      不可
   //       m{}    パターンマッチ     可
            s{}{}       置換          可
           tr{}{}       変換         不可

展開が行なわれる構文では、"$" や "@" で始まる変数が、以下のシーケンスと 同時に展開されます:

\t          タブ
\n          改行
\r          復帰
\f          改ページ
\v          垂直タブ (それが何であっても)
            (訳注: これは使えないように見える)
\b          バックスペース
\a          アラーム (ベル)
\e          エスケープ
\033        8 進数で表した文字
\x1b        16 進数で表した文字
\c[         コントロール文字
\l          次の文字を小文字にする
\u          次の文字を大文字にする
\L          \E まで小文字にする
\U          \E まで大文字にする
\E          変更の終わり
\Q          \E まで正規表現のメタ文字をクォートする

パターンはさらに、正規表現として展開が行なわれます。これは、変数が展開さ れた後の 2 回目のパスで行なわれるので、変数に正規表現を含めておき、パター ンの中へ展開することができます。もし、そうしたくないのであれば、\Q を使 うと変数の内容を文字どおりに展開することができます。

上記のものを除けば、複数の段階を踏んで展開が行なわれることはありません。 特に、シェルのプログラマの期待とは裏腹に、バッククォートはダブルクォート の中では展開されませんし、シングルクォートがダブルクォートの中で使われて も、変数の展開を妨げることはありません。

?PATTERN?
これは、reset() 演算子を呼び出すごとに 1 度だけしかマッチしないことを除 いては /pattern/ による検索と全く同じです。たとえば、ファイルの集まりの 中で個々のファイルについて、あるものを探すとき、最初の 1 つだけの存在が わかれば良いのであれば、この機能を使って最適化をはかることができます。現 在のパッケージにローカルとなっている ?PATTERN? のパターンだけが reset さ れます。 この方法は、あまりお勧めしません。Perl の将来のバージョンでは削除される かもしれません。
m/PATTERN/gimosx
/PATTERN/gimosx
パターンマッチで文字列検索を行ない、スカラコンテキストでは真 (1) または 偽 (") を返す。=~ 演算子か !~ 演算子で検索対象の文字列を示さなかったと きには、$_の文字列が検索対象となります。(=~ で指定される文字列は、左辺値 である必要はありません。式を評価した結果でもかまいませんが、=~ の優先順 位がいくぶん高いことに注意してください。)perlre manpage を参照してくださ い。 オプションには、 があります。 区切文字が "/" のときには、最初の m は付けても付けなくてもかまいません。 m を付けるときには、英数字でも空白でもない、任意の任意の文字のペアを、区 切文字として使うことができます。これは "/" を含む UNIX のパス名にパター ンパッチを行なうときに便利でしょう。\/ といった LTS (楊枝偏執症候群) を 避けるためにも。 PATTERN には、変数が含まれていてもよく、パターンが評価されるごとに、変数 は展開され (パターンが再コンパイルされ) ます。(2 つの変数 $) と $| は文 字列の終わりを調べるパターンであると解釈されるので、展開されません。)パ ターンがコンパイルされるのを 1 度だけにしたい場合には、終わりの区切文字 の後に /o 修飾子を付けます。これにより、実行時に再コンパイルが頻繁に起こ ることが避けられ、展開する値がスクリプトの実行中に変化しない場合に有効な ものとなります。しかし、/o を付けることは、パターンの中の変数を変更しな いことを約束するものです。変更したとしても、Perl がそれに気付くことはあ りません。 PATTERN を評価した結果が空文字列となった場合には、最後に実行され (コンパ イルに成功し) た正規表現が、代わりに使われます。 パターンマッチが、リスト値が要求されるコンテキストで使われると、パターン の中の括弧で括られた部分列にマッチしたもので構成されるリストを返します。 これは、($1, $2, $3, ...) ということです。(この場合、$1 なども設定されま す。この点で Perl 4 の動作と違っています。)マッチが失敗した場合には、空 配列が返されます。マッチが成功した場合で、括弧が無い場合には、リスト値 (1) が返されます。 例:
open(TTY, '/dev/tty');
<TTY> =~ /^y/i && foo();    # 要望により foo を実行

if (/Version: *([0-9.]*)/) { $version = $1; }

next if m#^/usr/spool/uucp#;

# 安上がりな grep
$arg = shift;
while (<>) {
    print if /$arg/o;       # 1 度だけコンパイル
}

if (($F1, $F2, $Etc) = ($foo =~ /^(\S+)\s+(\S+)\s*(.*)/))
最後の例は、$foo を最初の 2 つの単語と行の残りに分解し、$F1 と $F2 と $Etc に代入しています。変数に代入されれば、すなわちパターンがマッチすれ ば、if の条件が真となります。 /g 修飾子は、グローバルなパターンマッチを指定するもので、文字列の中で可 能な限りたくさんマッチを行ないます。この動作は、コンテキストに依存します。 リストコンテキストでは、正規表現内のすべての括弧付けされたものにマッチし た部分文字列全部のリストが返されます。括弧がなければ、パターン全体を括弧 で括っていたかのように、すべてのマッチした文字列のリストが返されます。 スカラコンテキストでは、m//g は文字列内で繰り返しを行ない、マッチするご とに「真」を返し、最終的にマッチしなくなったときに「偽」を返します。(言 い換えると、前回止まった場所を覚えていて、その場所から検索を再開するとい うことです。文字列の現在の検索位置は、関数 pos() を使って知ることができ ます。See section 組み込み関数,を参照してください。)いかなる方法でも、対象の文 字列を変更すると、検索位置は先頭にリセットされます。 例:
# リストコンテキスト
($one,$five,$fifteen) = (`uptime` =~ /(\d+\.\d+)/g);

# スカラコンテキスト
$/ = ""; $* = 1;  # Perl 5 では、$* は使わないほうがよい
while ($paragraph = <>) {
    while ($paragraph =~ /[a-z]['")]*[.!?]+['")]*\s/g) {
        $sentences++;
    }
}
print "$sentences\n";
q/STRING/
'STRING'
シングルクォートされた、リテラル文字列です。バックスラッシュは、後ろに続 くものが区切文字か、別のバックスラッシュである場合を除いて無視されます。 区切文字やバックスラッシュが続く場合には、その区切文字自身もしくはバック スラッシュそのものが展開されます。
$foo = q!I said, "You said, 'She said it.'"!;
$bar = q('This is it.');
qq/STRING/
"STRING"
ダブルクォートされた、リテラル文字列です。
$_ .= qq
 (*** The previous line contains the naughty word "$1".\n)
            if /(tcl|rexx|python)/;      # :-)
qx/STRING/
`STRING`
展開され、システムのコマンドとして実行される文字列です。そのコマンドの、 標準出力を集めたものが返されます。スカラコンテキストでは、(複数行を含む かもしれない) 1 つの文字列が戻ってきます。リストコンテキストでは、($/ も しくは $INPUT_RECORD_SEPARATOR をどのように設定していても) 行のリストを 返します。
$today = qx{ date };
詳しくは「See section I/O 演算子,」の節を参照してください。
qw/STRING/
埋め込まれた空白を区切文字として、STRING から抜き出した単語のリストを返 します。これは、
split(' ', q/STRING/);
と完全に同じになります。 よく行なわれる例としては:
use POSIX qw( setlocale localeconv );
@EXPORT = qw( foo bar baz );
というものがあります。
s/PATTERN/REPLACEMENT/egimosx
文字列中でパターンを検索し、もし見つかれば、置換テキストで置き換え、置換 した数を返します。見つからなければ、偽 (0) を返します。 =~ 演算子や !~ 演算子によって文字列が指定されていなければ、変数 $_ が検 索され、修正されます。(=~ で指定される文字列は、スカラ変数、配列要素、ハッ シュ要素、あるいは、これらへの代入式といった左辺値でなければなりません。) あとで述べますが、区切り文字はスラッシュとは限りません。シングルクォート を区切り文字として使った場合には、PATTERN にも REPLACEMENT にも変数の展 開を行ないません。 それ以外の場合、文字列の最後を表わすものには見えない $ が PATTERN に含まれると、実行時に変数がパターン内に展開されます。最初 に変数が展開されるときにだけパターンのコンパイルを行ないたいときには、/o オプションを使ってください。パターンの評価結果が空文字列になった場合には、 最後に実行され (コンパイルに成功し) た正規表現が代わりに使われます。これ についてさらに詳しくは、See section 正規表現,を参照してください。 オプションには、 があります。 英数字、空白ではない任意の区切り文字で、スラッシュを置き換えることができ ます。先に述べたように、シングルクォートを使うと置換文字列での展開はされ ません (/e 修飾子を使えば可能です)。バッククォートを用いると、置換文字列 をコマンドとして実行して、その出力が実際の置換文字列に使われます。 PATTERN を括弧類で括った場合には、REPLACEMENT 用にもう一組の区切り文字を 用意します。これは、括弧類であっても、なくてもかまいません。例: s(foo)(bar) や s<foo>/bar/。/e は置換文字列を完全な Perl の式として解釈 し、その場所で直ちにeval() します。しかし、これはコンパイル時に構文チェッ クされます。 例:
s/\bgreen\b/mauve/g;  # wintergreen は変更しない

$path =~ s|/usr/bin|/usr/local/bin|;

s/Login: $foo/Login: $bar/; # 実行時パターン

($foo = $bar) =~ s/this/that/;

$count = ($paragraph =~ s/Mister\b/Mr./g);

$_ = 'abc123xyz';
s/\d+/$&*2/e;               # 'abc246xyz' となる
s/\d+/sprintf("%5d",$&)/e;  # 'abc  246xyz'
s/\w/$& x 2/eg;             # 'aabbcc  224466xxyyzz'

s/%(.)/$percent{$1}/g;      # パーセントエスケー
                                             # プを変更; /e なし
s/%(.)/$percent{$1} || $&/ge;  # 式となるので /e
s/^=(\w+)/&pod($1)/ge;      # 関数呼び出しを使う

# /e はネスト可能;
# $_ に単純に埋め込まれた変数を展開する
s/(\$\w+)/$1/eeg;

# C コメントの削除
$program =~ s {
    /\*     (?# 開始区切り文字にマッチ)
    .*?     (?# 最短一致でマッチ)
    \*/     (?# 終了区切り文字にマッチ)
} []gsx;

s/^\s*(.*?)\s*$/$1/;        # 空白の切り詰め

s/([^ ]*) *([^ ]*)/$2 $1/;  # 最初の 2 語の入れ替え
最後の例で \ の代わりに $ を使っているのに注意してください。sed と違って、 \<数字> の形式はパターンの方でのみ使用できます。その他の場所では、$<数字 > を使います。 ときには、/g を付けるだけでは、すべてを変更することができないことがあり ます。2 つ例を示します:
# 整数の適切な位置にコンマを入れる
1 while s/(.*\d)(\d\d\d)/$1,$2/g;      # perl4
1 while s/(\d)(\d\d\d)(?!\d)/$1,$2/g;  # perl5

# タブを 8 カラムのスペースに展開
1 while s/\t+/' ' x (length($&)*8 - length($`)%8)/e;
tr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds
検索リスト (SEARCHLIST) に含まれる文字を、対応する置換リスト (REPLACEMENTLIST) の文字に変換します。置換または削除が行なわれた、文字数 を返します。=~ 演算子や =! 演算子で文字列が指定されていなければ、$_の文 字列が変換されます。(=~ で指定される文字列は、スカラ変数、配列要素、ハッ シュ要素、あるいは、これらへの代入式といった左辺値でなければなりません。) sed の信仰者のために y が tr の同義語として提供されています。SEARCHLIST を括弧類で括った場合には、REPLACEMENTLIST 用に、もう一組の区切り文字を用 意します。これは、括弧類であっても、なくてもかまいません。
例: tr[A-Z][a-z] や tr(+-*/)/ABCD/。
オプションには、 があります。 /c 修飾子が指定されると、SEARCHLIST には補集合が指定されたものと解釈され ます。/d 修飾子が指定されると、SEARCHLIST に指定されて、REPLACEMENTLIST に対応するものがない文字が削除されます。(これは、SEARCHLIST で見つかった ものを削除する、ただそれだけの、ある種の tr プログラムの動作よりと比べれ ば、いく分柔軟なものになっています。)/s 修飾子が指定されると、同じ文字に 置き換えられた文字の並びを、その文字 1 文字だけに圧縮します。 /d 修飾子が使われると、REPLACEMENTLIST は、常に指定された通りに解釈され ます。/d が指定されない場合で、REPLACEMENTLIST が SEARCHLIST よりも短い と、同じ長さになるまで、REPLACEMENTLIST の最後の文字が繰り返されているも のとして扱われます。REPLACEMENTLIST が空文字列でのときには、SEARCHLIST と同じになります。後者は、ある文字クラスに含まれる文字数を数えるときや、 ある文字クラスの文字の並びを圧縮するようなときに便利です。 例:
$ARGV[1] =~ tr/A-Z/a-z/;    # 小文字に統一

$cnt = tr/*/*/;             # $_ 内の * を数える

$cnt = $sky =~ tr/*/*/;     # $sky 内の * を数える

$cnt = tr/0-9//;            # $_ 内の数字を数える

tr/a-zA-Z//s;               # bookkeeper -> bokeper

($HOST = $host) =~ tr/a-z/A-Z/;

tr/a-zA-Z/ /cs;             # 英字以外を 1 つの
                            # スペースに変換する

tr [\200-\377]
   [\000-\177];             # 8th bit 目を削除
変換テーブルはコンパイル時に作られるので、SEARCHLIST も REPLACEMENTLIST もダブルクォート展開の対象とはなりません。変数を使いたい場合には、eval() を使わなければならないということです:
eval "tr/$oldlist/$newlist/";
die $@ if $@;

eval "tr/$oldlist/$newlist/, 1" or die $@;


Go to the first, previous, next, last section, table of contents.

検索式: