在我的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) );
}
问题是,当输入包含&lt; 3“字段”,我想要确保比所有不存在的字段定义并包含“DEFAULT”。所以想要下一个:输入 - &gt;将输出分配给变量
"mk aXXb ac" -> "mk" "a42b" "ac"
"deXX ab" -> "de42" "ab" "DEFAULT"
依旧......
尝试下一个,但不起作用。
my($action, $v1, $v2) = map { s/XX/42/g; $_ // "DEFAULT" } split /\s+/;
看起来比我误解了map
和/或//
运算符的工作方式。
答案 0 :(得分: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;
答案 1 :(得分:3)
这将按照你的要求行事。它使用Perl 5版本10中引入的defined-or operator //
。
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";
}