Masaの備忘録 - 変数 関連
PerlのTips【目次】

トップページ -> Perl -> 変数 関連

変数 関連

変数の交換

変数 $a と $b の内容を普通に交換することを考えると、
$tmp = $a;
$a = $b;
$b = $tmp;
というダサい中間変数 $tmp を作成したくなるが、Perlだとこれが思いっきり簡単に、
($a,$b) = ($b,$a);
で済む。
配列の要素の交換も同様にでき、@test の1個目と2個目を交換する場合は、
($test[0], $test[1]) = ($test[1], $test[0]);
と書けばできる。


トップページ -> Perl -> 変数 関連


初期化されていない変数には何が入る?

初期化されていない変数には、いったい何が入っているのだろうか?
それを確かめるためのプログラム(kakunin.pl)が以下となる。
#! /usr/bin/perl
# kakunin.pl

$kotae1 = $nazo1 + 1;
print "$kotae1\n";
$kotae2 = $nazo2."nani";
print "$kotae2\n";
実行結果
$./kakunin.pl
1
nani
初期化していない変数 nazo1 に 1 を加えた場合、$kotae1 は、1となる。つまり、nazo1 という変数には、0 が入っていたことになる。
では、初期化していない変数 nazo2 の場合はどうだろうか。nazo2 に "nani" という文字を結合すると、$kotae2 は、"nani" となる。すなわち、nazo2 には、""(つまり、空文字列)が入っていたのだ。

実は、初期化されていない変数は、
  • 数値としてみた場合は0としてふるまい
  • 文字列としてみた場合は""としてふるまう
という便利な値である、undef で定義されている。
$nazo = undef;
というように自分で書いて使うことも可能である。

補足
  • 文字列を結合する演算子は、 「.」(ピリオド)を用いる。
(使用例)
$first_name = "Taro";
$last_name = "Tanaka";
$full_name = $first_name . " " . $last_name; #名前と苗字を1文字分空けて結合
print "My name is $full_name.\n";

トップページ -> Perl -> 変数 関連


省略変数($_)

perlには省略の美学というものがあり、いろいろな箇所で変数名を省略することができる。
省略した場合は、$_ を指定したものとみなされる。

標準入力を出力するプログラムで説明する。
while(<STDIN>){
    print;      # print文で何も指定しなかった場合は、$_ の中身が出力される
}
このプログラムは、次のように書いてもまったく同じである。
while($_ = <STDIN>){
    print $_;      # print文で何も指定しなかった場合は、$_ の中身が出力される
}
これらから、以下のことがわかる。
  • printで出力するものを省略すると、$_ の中身が出力される


トップページ -> Perl -> 変数 関連



特殊な変数($_など)を分かりやすい文字に置き換える

プログラムの先頭で、
use English;
と書くと、上述した$_などの特殊な変数が分かりやすい変数名に変換される。

具体的には、
特殊変数変換後変数の説明
$_$ARG省略変数
$.$INPUT_LINE_NUMBER または $NR現在入力中の行番号
$`$PREMATCHマッチ前
$&$MATCHマッチ文字列
$'$POSTMATCHマッチ後
$0$PROGRAM_NAME現在実行中のプログラム名
などがある。(これ以外は、こちらを参照)

最後の$0は、「この結果は test.pl によって得られたものです」などと言うように、
プログラム名を出力するときに使え、そのプログラム名を変更した場合でも、
いちいちメッセージを出力するために変更した部分を修正しなくても済む。

トップページ -> Perl -> 変数 関連



livedoor Wiki関連リンク