我有一个脚本打印出一串由管道分隔的值。 我想要做的是,如果$ 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|
谢谢
答案 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;
但是,每当您发现自己创建编号变量(例如f1
,f2
,f3
)时,您应该考虑使用“数组”:
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