在我的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和/或//操作员的工作方式.
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)