Perl の qw//
はシジル (Perl の変数の初めにつく $
などの記号) がついた変数をダブルクォート中のように展開することはありません。
#!/usr/bin/perl
use strict;
use warnings;
my @list = qw($foo @bar %baz);
print "@list\n";
これの実行結果は
$ perl qw.pl
$foo @bar %baz
です。
最初の頃は結構ハマるという話。私もそうでした。
qw//
の中では、デリミタ以外の文字はほとんど意味を失います。
#!/usr/bin/perl
use strict;
use warnings;
my @list = qw/' \' \ \\ \/ moge \x5C \n \\/;
print "@list\n";
これの実行結果は
$ perl qw2.pl
' \' \ \ / moge \x5C \n \
です。
特殊なのは、デリミタのエスケープのためにバックスラッシュが使えることで、バックスラッシュを2つ連続で書いた時にバックスラッシュが1つになってしまうことです。これはシングルクォート中のルールと同様です。
とはいえ、デリミタのエスケープが必要になったら別のデリミタを選べばよいという感じもするので、この機能は一種余計な感じがします。
その他、ダブルクォート中では使える "\x文字コード"
や "\n"
といった表記もシングルクォート中と同様 qw//
ショートカットでは全て解釈されることはありません。
このあたりの話は perldoc perlop
が詳しいです。
qw//
がほとんどのリテラルをそれそのものとして扱う性質を利用すると、安心してリストを作成できます。
#!/usr/bin/perl
use strict;
use warnings;
my %charname = ( qw/
> lt
< gt
" apos
' quot
# sharp
/);
ここまで記号まみれになるとエディタ等によってはシンタックスハイライトが狂う可能性がありますが、純粋に qw/
から /
が次に現れるまでが空白区切りの単語リストとなって解釈されます。
とはいえ、これを perl インタプリタで実行させると
$ perl qw3.pl
Possible attempt to put comments in qw() list at qw3.pl line 12.
などと警告を言われてしまいます。「qw()
の中ではコメント文字は使えないけど勘違いしていない?」ということです。#
記号を使ってしまったことで気を遣ってくれたわけですね。
エラーじゃなくて警告なので実行自体に問題はないのですが、とはいえ分かって書いているときには相当おせっかいな警告です。
これは以下のような no warnings
を書くことで警告を抑制することが出来ます。
#!/usr/bin/perl
use strict;
use warnings;
no warnings 'qw';
これについての詳しい解説は perldoc warnings
に書かれています。