将split的结果传递给变量但确保它们在perl中具有默认值

Nem*_*emo 0 perl

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

问题是,当输入包含<3"字段"并且我想要确保所有不存在的字段都被定义并包含"DEFAULT".所以想要下一个:输入 - >分配输出到变量

"mk aXXb ac"  -> "mk" "a42b" "ac"
"deXX ab"     -> "de42" "ab" "DEFAULT"
Run Code Online (Sandbox Code Playgroud)

等等..

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

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

这看起来比我误解了map和/或//操作员的工作方式.

ike*_*ami 5

split将永远不会回来undef,所以你//将永远返回其LHS.


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

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

如果它是所有的默认值,

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

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

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

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

如果它是所有的默认值,

my @fields = map { s/XX/42/rg } split;
$fields[$_] //= 'DEFAULT' for 0..2;
Run Code Online (Sandbox Code Playgroud)