是否有插值引用的单词列表运算符?

时间:2011-04-24 15:33:03

标签: perl operators

qw{}是一种用于编写列表的漂亮方式。是否有类似的内插单词,即扩展变量? perlop似乎没有任何提及。

4 个答案:

答案 0 :(得分:6)

不,没有内置,但我们很多人都写自己的。

对于行列表的两种ql()需求也是如此。我使用deQ表示q()版本,使用deQQ表示与Perl的“hasta”运算符一起使用的qq版本:

sub dequeue($$) {
    my($leader, $body) = @_;
    $body =~ s/^\s*\Q$leader\E ?//gm;
    return $body;
}

sub deQ($) {
    my $text = $_[0];
    return dequeue q<|Q|>,  $text;
}

sub deQQ($) {
    my $text = $_[0];
    return dequeue qq<|QQ|>, $text;
}

这让我可以使用这样的东西:

sub compile($) {
    my $CODE = shift();
    my $wrap = deQQ<<"END_OF_COMPILATION";
                |QQ|
                |QQ|    use warnings qw[FATAL all];
                |QQ|    no  warnings "utf8";
                |QQ|
                |QQ|    sub { 
                |QQ|           my \$_ = shift; 
                |QQ|           $CODE; 
                |QQ|           return \$_;
                |QQ|    }
                |QQ|
END_OF_COMPILATION

    return eval $wrap;

} 

        my $sorter = new Unicode::Collate::
                            upper_before_lower  => 1,
                            preprocess          => \&reduce_for_sorting,
                            entry               => deQ<<'END_OF_OVERRIDE'
             |Q|
             |Q|        005B 006E 002E ; [.0200.0020.0002.0391] # [n.
             |Q|        005B           ; [.0220.0020.0002.0392] # [
             |Q|        005D           ; [.0225.0020.0002.0395] # ]
             |Q|
END_OF_OVERRIDE

看看它是如何工作的?

答案 1 :(得分:6)

您可以将qw()洒在“常规”列表中。我有时写这样的代码:

my @command = (
    qw(cat arg1 arg2),
    $arg3,
    qw(arg4 arg5 arg6),
    "$arg7 $arg8",
    # ...
);

答案 2 :(得分:2)

扩大ysth的答案:

sub qqw($) { split /\s+/, $_[0] }

my @list = qqw"$var interpolating string";

警告:我不知道如何处理前导和尾随空格。此外,原型应该确保qqw不会像子调用那样使用多个逗号分隔值,但是你应该检查它是否确定。

答案 3 :(得分:1)

只需:

split(' ', "$var interpolating string ");