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

Tim*_*Tim 3 perl operators

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

tch*_*ist 6

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

也适用于ql()行列表的两种需求.我用deQ了一个q()版本,deQQ一个qq版本是那些用Perl的"闪现"操作符的:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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;

} 
Run Code Online (Sandbox Code Playgroud)

要么

        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
Run Code Online (Sandbox Code Playgroud)

看看它是如何工作的?

  • @蒂姆:谢谢。:) 在 Perl 中,一切皆有可能,但并非一切都是有利的。所以,是的,你*可以,*但你不想在早上看自己。为了获得你的选择你的报价行为,你必须进入被称为源过滤器的闹鬼疯人院。即使是“use version”编译指示的“qv()”版本引用函数也不会执行此操作,尽管如您所见,它确实执行了其他操作。我想你现在应该对 `sub qqw($) { my @w = split /[\h\v]+/, $_[0]; 感到高兴 移位@w while @w &amp;&amp; !length($w[0]); 返回@w}`。稍后决定是否确实需要采取非常措施。 (2认同)

Sea*_*ean 6

你可以qw()在"常规"列表中撒上.我有时写这样的代码:

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