将新变量转换为预先存在的变量perl

时间:2014-11-01 05:42:58

标签: perl

我有一个脚本打印出一串由管道分隔的值。 我想要做的是,如果$ f3字段等于某些东西,比如字母C. 我希望它打印出xout。 但是如果$ f3没有填充任何值,我想要N和G. 分别打印在$ f5和F7文件中。

#!/usr/bin/perl
use strict;
use warnings;
my ( $system, $f2, $f3, $f4, $f5, $f6, $f7 ) = "";
#$f3="C";
my $xout = "$system|$f2|$f3|$f4|$f5|$f6|$f7|\n";
if ( defined $f3 && $f3 ne '' ) {
    print $xout;
    print "\$f3 is defined \n";
} else {
    my $f5 = "N";
    my $f7 = "G";
    print $xout;
    print "the 7th and 8th blocks should have values \n";
}

这是输出

 Use of uninitialized value $f2 in concatenation (.) or string at ./test_worm_output line 6.
 Use of uninitialized value $f3 in concatenation (.) or string at ./test_worm_output line 6.
 Use of uninitialized value $f4 in concatenation (.) or string at ./test_worm_output line 6.
 Use of uninitialized value $f5 in concatenation (.) or string at ./test_worm_output line 6.
 Use of uninitialized value $f6 in concatenation (.) or string at ./test_worm_output line 6.
 Use of uninitialized value $f7 in concatenation (.) or string at ./test_worm_output line 6.
 |||||||
 the 7th and 8th blocks should have values

如果f被取消注释,我得到:

    (lots of uninitialized values lines)
    ||C|||||
    $f3 is defined

我想要的是如果f没有定义,如果没有价值我需要它打印出来

    ||||N||G|

最终这些行看起来像这样(其他字段将具有值) 但如果填充了第三个值,我就不能有N或G,如果$ f3是空白的 我需要N和G.

    host1||C|||||
    host2||C|||||
    host3||||N||G|
    host4||C|||||
    host5||||N||G|

谢谢

1 个答案:

答案 0 :(得分:3)

在第

my ($system ,$f2,$f3,$f4,$f5,$f6,$f7) = ""  ;

您只是初始化列表中的第一个变量$system。要初始化列表中的所有变量,您需要在RHS上使用相同数量的值:

my ($system, $f2, $f3, $f4, $f5, $f6, $f7) = ("", "", "", "", "", "", "");

my ($system, $f2, $f3, $f4, $f5, $f6, $f7) = ("") x 7;

但是,每当您发现自己创建编号变量(例如f1f2f3)时,您应该考虑使用“数组”:

my @fields = ("") x 7;

if ($fields[2] eq "") {
    @fields[4, 6] = ("N", "G");
}

print join("|", @fields), "\n";

输出:

||||N||G

(当然,这段代码毫无意义,因为我们将$fields[2]显式设置为空字符串,然后检查它是否等于...空字符串。我假设您的实际代码更复杂。)< / p>

在您的情况下,看起来第一个字段与其他字段不同,因此将数据存储在数组散列中会更有意义(假设主机名是唯一的):

use strict;
use warnings;

# Populate the hash 
my %data;
foreach my $host_num (1..5) {
    my @fields = ("") x 6;
    $fields[1] = "C" if $host_num == 1 or $host_num == 2 or $host_num == 4;

    my $host_name = "host" . $host_num;
    $data{$host_name} = [ @fields ];
}

# Print the contents 
foreach my $host (sort keys %data) {
    if ($data{$host}[1] eq "") {
        @{ $data{$host} }[3, 5] = ("N", "G");
    }

    print join("|", $host, @{ $data{$host} }), "\n";
}

输出:

host1||C||||
host2||C||||
host3||||N||G
host4||C||||
host5||||N||G