Perl/演算子

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

代入演算子[編集]

=

代入処理に使われます。

$a = 1;   #($aに 1 が代入されます)
$a = "a"; #($aに a が代入されます)
+= と -= と *= と /= と %= と **=

計算結果を代入します。演算の詳細は後の項を参照してください。

$a += $b;     #($aに$aと$bを足したものが代入されます)
.=

文字列を結合して代入します。

$a .= '(end)';     #($aの末尾に '(end)' が追加されます)

算術演算子[編集]

+ と - と * と /

数値の加減乗除に使われます。

$a = 1 * 2 + 3 / 4;     #($aに 2.75 が代入されます)


%

除算の「余り」を返します。

$a = 7 % 4;     #($aに 3 が代入されます)

算数では

7 ÷ 4 = 1 あまり 3

です。


**

数値のべき乗を求めるのに使います。

$a = $b ** 3;     #($aに$bの3乗が代入されます)


++ と --

(インクリメントとデクリメント) 数値に1を足したり引いたりします。 ++ で数値に1がたされます。-- で1が引かれます。

++ で1を足すことを「インクリメント」と言います。 -- で 1 を引くことを「デクリメント」と言います。

変数の前におくか後ろに置くかで意味が変化します。

$a++;     # $aの値が1増えます。

$a = 5;
$b = 3;

print --$a;     #$aの値が1減り、4が出力されます。
print $b++;     #画面には3が出力されますが、その後に$bの値が1増えます。

文字列演算子[編集]

. と x

ドット記号(.)は文字列の「連結」に使われます。x は「同語反復」に使われます。

$a = "a" . "b" x 2;     #($aに abb が代入されます)

クオート演算子[編集]

q と qq と' と "

文字列を表します。

$a = "Hello, world!";
$b = qq(Hello, world!);     # 上と同じ
$c = 'I\'m fine.';
$d = q(I'm fine.);          # 上と同じ -- 「'」をエスケープする必要がない
qw と qr と qx

スペースで区切った単語のリスト、正規表現、バッククォート

@a = qw(a b c);      # @a = ('a', 'b', 'c'); と同じ
$b = qr/^Regexp$/i;
$c = qx/uname -a/;   # `uname -a`; と同じ

ビット演算子[編集]

| と& と ~

ビットごとの論理和、論理積、否定を返します。

>> と <<

右ビットシフト、左ビットシフトを行います。


論理演算子[編集]

|| と or と && と and

主にif文などで、複数の条件を指定するときに使用します。|| と or、&& と and はそれぞれ同じ意味です。(厳密に言えば、or,andの方が優先順位が低いです)

if ( ( $a == 5 ) || ( $b == 3 ) ) {
    # この部分は$aが5、または$bが3のときに実行されます
}

if ( ( $a == 8 ) && ( $b == 7 ) ) {
    # この部分は$aが8、かつ$bが7のときに実行されます
}
or

or は優先順位が低く、左引数が偽である場合のみ右引数の評価を行い(短絡評価)、最後に評価された値を返すので、例外処理にも使われます。

$flag or die;


not

notは、与えられた論理式の否定を表します。Aが真のとき、not A は偽です。Aが偽のとき、not A は真です。

$a = 2;
if ( not $a == 5  ) {
  print "実行された";
}
実行結果
実行された
解説

$a は2なので、論理式「$a == 5」は偽です。なので、not $a == 5 はその反対なので、つまり 、not $a == 5 は真です。

if の後ろの丸カッコ内の条件が真なので、ブロック{ } 内が実行されるので、ブロック内の print が実行される仕組みです。

数値比較演算子[編集]

< と > と <= と >=

不等号を表すのに利用します。

if ( $a > $b ) {
 #この部分は$aが$bより大きいときに実行されます
}

if ( $a <= $b ) {
 #この部分は$aが$b以下のときに実行されます
}


以上または以下の <= や >= については、最初に不等号の記号が来ます。(Perl にかぎらずC言語など他のプログラム言語でも、同様の順序です。)

数学記号の ≦ と <= は同じ意味ですが、パソコンの直接入力(半角英数)には ≦ が無いので、プログラミングでは <= で代用されます。PerlにかぎらずC言語などでもそういう仕組みです。


一般に = 記号は、語順では後回しになる場合が多いです。(おそらくだが、多くの演算で = を使うので、後回しにしたほうがコンパイラなどの効率が良いのだろう。)


== と !=

同じ数値であることや、違う数値であることを表すのに使用されます。両辺の変数などの内容を(文字列ではなく)数値として評価します。(もし両辺の変数内容を文字列として評価したい場合、別の演算子 eqと ne を使います。 詳しくは別の節で説明。)


if ( $a == $b ) {
     # この部分は$aが$bと同じ値のときに実行されます
}

if ( $a != $b ) ) {
     # この部分は$aが$bと違う値のときに実行されます
}


== は、両辺の値が等しい事を要求します。if文の中でよく使います。

(Perlに限らずC言語などでも、)よくあるミスで、「=」と記号をひとつだけにするミスがありますが、これはエラーになるか、または代入演算子として解釈されるのでバグになります。


!= は 両辺の値が等しくない事を要求します。つまり、!= は両辺の値が違っている事を要求します。


等しくない場合の != では、否定の記号 ! が先に来ます。(Perl にかぎらずC言語など他のプログラム言語でも、同様の順序です。)


<=>

左右の値の大小関係により -1, 0, 1 のいずれかを返します。これは主にsortで使われます。

@a = (22, 3, 111);

@a = sort {$a <=> $b} @a;
# この時点で@aは (3, 22, 111) になっています

@a = sort {$b <=> $a} @a;
# この時点で@aは (111, 22, 3) になっています

文字列比較演算子[編集]

eq と ne

両辺の文字列が、文字列として評価した場合に、同じ値かを調べるときに使用します。

なお、== および != は両辺が数値として評価した場合なので、意味が違います。

Perlには変数に型が無いので、C言語とは異なり、比較演算子の側で、変数の内容を数値として評価するか、内容を文字列として評価するかの指定が必要になるのです。


if ( $a eq $b ) {
    # この部分は$aが$bと同じ文字列のときに実行されます
}

if ( $a ne 'correct' ) ) {
    # この部分は$aに代入されている文字列が 'correct' でなかったときに実行されます
}

eq は、両辺を文字列として比較したときに、両辺が同じであることを要求します。

なお「eq」とは equal (等号、等しい)の略であるとされる。

ne は、両辺を文字列として比較したときに、両辺が異なることを比較します。

「ne」とは not equal の略だとされる。


le と ge と lt と gt

二つの文字列の辞書順での大小を比較します。

if ($a le $b) {
     # この部分は$aが$b以下のときに実行されます
}

; le -- less than or equal -- 以下
; ge -- greater than or equal -- 以上
; lt -- less than -- より小さい未満
; gt -- greater than -- より大きい
cmp

二つの文字列の辞書順での大小関係により-1, 0, 1のいずれかを返します。これは主にsortで使われます。

@a = ('3', '22', '111', 'z', 'A', 'a', 'Z');

@a = sort {$a cmp $b} @a;
# この時点で@aは ('111', '22', '3', 'A', 'Z', 'a', 'z') になっています

@a = sort {$b cmp $a} @a;
# この時点で@aは ('z', 'a', 'Z', 'A', '3', '22', '111') になっています

条件演算子[編集]

(条件) ? (真) : (偽)

条件が成立する場合は(真)の値を、そうでない場合は(偽)の値を返します。

$a = 1;
$b = $a ? 'true' : 'false';      # $b には 'true' が代入される

範囲演算子[編集]

リテラル .. リテラル で範囲を表すことができる。

foreach(1 .. 100) {
  print $_;
}

とすると、1234567891011.........99100が出力される。 また、文字列にも適用することができ(マジカルインクリメント)、

foreach('a' .. 'z') { 
  print $_;
}

の実行結果は、abcdefg........xyzとなる。 右オペランドが不適切な場合にはその文字列長を超えない範囲の全てを範囲とする。

foreach('A' .. 'vv') {
  print $_;
}

の実行結果は、ABCDEFG........ZVZWZXZYZZとなる。


スカラーコンテキストの場合はフリップフロップ演算子となる。オペランドが数値の場合は、暗黙に$.(行番号)と比較 (==) を行う。...演算子を用いた場合は、左オペランドが真となった後、次の行に移ってから右オペランドの評価を行う。

while (<>) {
    if (1 .. 10) {
        print;     # 1行目から10行目を出力
    }
    if (/<head>/ .. /<\/head>/) {
        print;     # head要素の内容を出力
    }
}

置換演算子[編集]

s///[編集]

s/PATTERN/STRING/

PATTERNにマッチするものをSTRINGに置換します。PATTERNは正規表現です。

$str = "Wiki";
$str =~ s/(Wiki)/$1pedia/;
print $str; # Wikipedia

tr///[編集]

tr/PATTERN1/PATTERN2/

1文字を対応する1文字に置換します。PATTERNには正規表現ではなく、文字クラスを指定します。

$str = "ABC BCA CAB";
$str =~ tr/ABC/012/;     # Aを0に、Bを1に、Cを2に置換
print $str; # 012 120 201

ハイフンを使って範囲指定を行うことができます。

$str = "WIKIBOOKS";
$str =~ tr/A-Z/a-z/;     # 大文字を小文字に置換
print $str; # wikibooks

y///[編集]

y/PATTERN1/PATTERN2/

tr///の同義語です。