Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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 に書かれています。

xtetsuji
北海道出身で東京都在住の30代男性。主にPerlプログラマー、ときどき数学屋さん。Perl入学式やPerlBeginnersなど、コミュニティ活動も多数。古典派周辺のクラシック音楽やお洒落カフェを好んでいます。あと、路線バスも好き。
http://post.tetsuji.jp/
gaiax
人と人をつなげる Empowering the people to connect.
http://www.gaiax.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away