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

时间:2013-05-06 11:45:12

标签: 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) );
}

问题是,当输入包含&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和/或//运算符的工作方式。

2 个答案:

答案 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";
}