qw// は変数展開をしない

  • 5
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Perl の qw// はシジル (Perl の変数の初めにつく $ などの記号) がついた変数をダブルクォート中のように展開することはありません。

qw.pl
#!/usr/bin/perl

use strict;
use warnings;

my @list = qw($foo @bar %baz);

print "@list\n";

これの実行結果は

$ perl qw.pl
$foo @bar %baz

です。

最初の頃は結構ハマるという話。私もそうでした。

qw// の中では、デリミタ以外の文字はほとんど意味を失います。

qw2.pl
#!/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// がほとんどのリテラルをそれそのものとして扱う性質を利用すると、安心してリストを作成できます。

qw3.pl
#!/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 に書かれています。