Есть ли интерполирующий кавычный оператор списка слов? - PullRequest
3 голосов
/ 24 апреля 2011

qw{} - приятный способ написания списков. Есть ли аналог, который интерполирует слова, то есть расширяет переменные? perlop , кажется, не упоминает ничего.

Ответы [ 4 ]

6 голосов
/ 24 апреля 2011

Вы можете посыпать qw() посреди «обычного» списка.Я иногда пишу такой код:

my @command = (
    qw(cat arg1 arg2),
    $arg3,
    qw(arg4 arg5 arg6),
    "$arg7 $arg8",
    # ...
);
6 голосов
/ 24 апреля 2011

Нет, встроенного нет, но многие из нас пишут свои.

Также для двух видов ql() нужны списки строк. Я использую deQ для q() версии и deQQ для qq версии тех, которые работают с оператором Perl «hasta»:

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

Видите, как это работает?

2 голосов
/ 13 июля 2012

Расширение на ответ Ysth:

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

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

Предостережения: я не знаю, как обрабатываются начальные и конечные пробелы. Кроме того, прототип должен убедиться, что qqw не использует несколько значений, разделенных запятыми, как это обычно делают вложенные вызовы, но вы должны убедиться в этом.

1 голос
/ 24 апреля 2011

Просто:

split(' ', "$var interpolating string ");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...