0

在我的 perl 程序中需要

use strictures 1;
while(<>) {
    chomp;
    my($action, $v1, $v2) = map { s/XX/42/g; $_ } split /\s+/;
    print "=$action=$v1=$v2=\n";
    do_someting( $action, func1($v1), func2($v2) );
}

问题是,当输入包含 < 3 个“字段”并且我想确保所有不存在的字段都已定义并包含“DEFAULT”时。所以想要下一个:输入->将输出分配给变量

"mk aXXb ac"  -> "mk" "a42b" "ac"
"deXX ab"     -> "de42" "ab" "DEFAULT"

等等..

尝试了下一个,但不起作用。

    my($action, $v1, $v2) = map { s/XX/42/g; $_ // "DEFAULT" } split /\s+/;

它看起来比我误解map和/或//操作员的工作方式。

4

2 回答 2

5

split永远不会回来undef,所以你//将永远返回它的 LHS。


如果它们有不同的默认值,

my ($action, $v1, $v2) = map { s/XX/42/rg } split;
$action //= 'default action';
$v1     //= 'default v1';
$v2     //= 'default v2';

如果所有的默认值都相同,

my ($action, $v1, $v2) = map { s/XX/42/rg } split;
$_ //= 'DEFAULT' for $action, $v1, $v2;

如果您使用数组而不是单独的变量,则可以减少重复。

如果它们有不同的默认值,

my @defaults = ('default action', 'default v1', 'default v2');
my @fields = map { s/XX/42/rg } split;
$fields[$_] //= $defaults[$_] for 0..2;

如果所有的默认值都相同,

my @fields = map { s/XX/42/rg } split;
$fields[$_] //= 'DEFAULT' for 0..2;
于 2013-05-06T11:55:59.390 回答
3

这将满足您的要求。//它使用在 Perl 5 版本 10 中引入的定义或运算符。

use 5.010;

while (<>) {
  s/XX/42/g for my ($action, $v1, $v2) = map { $_ // 'DEFAULT' } ((split),(undef)x3);
  print "=$action=$v1=$v2=\n";
}

如果您有早期版本,那么这将做同样的事情

while (<>) {
  s/XX/42/g for my ($action, $v1, $v2) = map { defined() ? $_ : 'DEFAULT' } ((split),(undef)x3);
  print "=$action=$v1=$v2=\n";
}
于 2013-05-06T11:54:49.317 回答