qw演算子

広告

配列の初期化を行う時に便利な演算子にqw演算子がよく利用されます。qw演算子は一覧の文字列を空白文字を区切りとして分割したリストを返してくれます。書式は次の通りです。

qw/ 対象となる文字列 /

対象となる文字列には例えば「東京 大阪 名古屋 福岡」のような文字列を指定します。

qw/ 東京 大阪 名古屋 福岡 /

この文字列を空白文字(スペースや改行、タブなど)を区切りとして文字列を分割します。そして分割された単語を要素とするリストを作成します。この時連続した空白文字は1つの区切りとして扱われます。つまり次のように記述した場合と同じです。

('東京', '大阪', '名古屋', '福岡')

qw演算子で指定した文字列はシングルクォートで囲まれたものとして扱われますので文字列の中にエスケープシーケンス(一部除く)や変数などを記述しても特別な意味は持ちません。

複数の文字列をリスト形式ではなくqw演算子を用いて記述することで配列の初期化が簡単に記述できます。

my @pref = qw/ 東京 大阪 名古屋 福岡 /;

qw演算子の区切り文字

qw演算子では対象となる文字列がどこからどこまでなのかを示すために同じ記号を使って区切り文字とします(ここでの区切り文字は対象の文字列を区分するための空白文字のことではなく、対象の文字列がどこからどこからなのかを示すための区切り文字です)。

先ほどの例では区切り文字として「/」を使っていましたが、同じ記号であれば区切り文字はどんな文字でも構いません。また次の4つの場合は同じ記号でなくても使用できます。

qw( 対象となる文字列 )
qw{ 対象となる文字列 }
qw[ 対象となる文字列 ]
qw< 対象となる文字列 >

区切り文字が対象の文字列の中に含まれている場合は「¥」記号を使ってエスケープシーケンスを行うことが出来ます。

my @sample = qw/ abc d¥/g eea /;

ただエスケープシーケンスを行うかわりに区切り文字を変更するほうが簡単な場合もあります。

my @sample = qw( abc d/g eea );

サンプルプログラム

では簡単なプログラムで確認して見ます。

test6-1.pl

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

my @name = qw/ 伊藤 工藤 山田 /;

for (my $i = 0; $i < 3; $i++){
  print "$name[$i]¥n";
}

上記を「test6-1.pl」の名前で保存します(文字コードはUTF-8です)。そしてコマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。

qw演算子

( Written by Tatsuo Ikura )