我编写了一个perl脚本来合并来自不同机器的gcov文件。下面是我为合并而编写的子例程。
sub merge_gcov()
{
open(FILE1, "<$_[0]") or die "can not open file";
open(FILE2, "<$_[1]") or die "can not open file";
open(FILE3, ">$_[2]") or die "can not open file";
my ($line1, $line2 , $flag );
while ( 1 )
{
$line1 = <FILE1>; # read them each
$line2 = <FILE2>;
last unless ( $line1 || $line2 ); # if both empty exit loop
#
# otherwise test for which one just finished
#
unless( $line1 )
{
$flag = 1;
last;
}
unless( $line2 )
{
$flag = 2;
last
}
#
# now do the voodo on the two lines
#
chomp($line2);
chomp($line1);
if($line1=~/^\s*-/ and $line2 =~/^\s*-/)
{
print FILE3 "$line1\n";
}
elsif($line1=~/^\s*#####/ and $line2 =~/^\s*#####/)
{
print FILE3 "$line1\n";
}
elsif($line1=~/^\s*#####:\s{0,}(\d{1,})/ and $line2 =~/^\s{0,}(\d{1,})/)
{
print FILE3 "$line2\n"
}
elsif($line1=~/^\s{0,}(\d{1,})/ and $line2 =~/^\s*#####:\s{0,}(\d{1,})/)
{
print FILE3 "$line1\n"
}
elsif($line1=~/^\s{0,}(\d{1,})/ and $line2 =~/\s{0,}(\d{1,})/)
{
my @values1 = split(/:/, "$line1");
my @values2 = split(/:/, "$line2");
print FILE3 (" ",$values1[0]+$values2[0]),":","$values1[1]:","$values1[2]\n";
}
else
{
print FILE3 "$line1\n";
print FILE3 "$line2\n";
}
}
close(FILE3);
}合并是正确的,但是在合并之后,我得到了以下错误.
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 284046 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 284414 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 302995 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 311633 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 311962 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 321536 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 323445 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 329553 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 336009 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 336330 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 338188 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 343170 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 349037 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 349610 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 633937 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 634509 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 634877 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 653458 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 662096 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 662425 (#1)
Use of uninitialized value in concatenation (.) or string at
./Merge_gcov_generalised.pl line 226, <FILE2> line 671999 (#1)
Use of uninitialized value in concatenation (.) or string at我知道当我使用no警告时不会收到这些警告,但是还有其他方法来删除这些警告吗?
第226行是:print FILE3 (“",$values1+$values2),":","$values11:",”$values12\n“,
发布于 2013-01-18 12:49:47
如果您想要做的就是消除您已经期待并已经考虑到的特定警告,那么您所要做的就是:
{ no warnings 'uninitialized';
# **Small** bit of code causing the problem.
say "A string and $probably_undefined";
}我要强调的原因是,小代码是因为Perl没有1000个警告类别可以通过语用打开和关闭。它有几个相当广泛的类别,如果你离开太大的武器,一个空间会咬你。这样做的目的是查看每一种警告条件,并确定未初始化的值是否有任何效果--或者至少可以解释一下。
发布于 2014-09-23 03:04:50
您测试未初始化的行之一或另一行,但从未使用该信息,因此您将在最后的else中打印一个与换行符连接的else;这是警告的来源。
实际上,您的gcov文件中有一堆多余的换行符,这是由一个文件首先耗尽造成的,每个不匹配的行有一个。它们之所以有效,仅仅是因为gcov非常宽容它所接受的内容,或者因为gcov在看到第一个空换行符时停止了对输入的静默读取。第一个是伟大的,第二个是非常糟糕的。
要解决这个问题,我们需要弄清楚我们期望在哪里有一个undef,以及当我们找到它时应该做些什么。当我们到达每个文件的末尾时,这段代码可以在$line1和$line2中生成$line2。让我们看看如何使用这些工具来查看undef在哪里可以使用,哪些地方不合适。
undef):这是对undef的一个很好的使用。$flag:好用法,但逻辑错误,因为您再也不使用$flag了。undef的行:不好的用法,因为这将生成警告并输出额外的空换行符。由于模式匹配对于undef都会失败,所以您可以跳过设置$flag的代码,使最后一个else看起来如下:
...
else {
# One or the other file has run out already. Note that
# the $line variables being undef here is OK because that's
# an expected possible value that we're actually testing for.
# We could used "defined $lineX" but since undef itself is
# false, this is okay.
print FILE3 "$line1" if $line1;
print FILE3 "$line2" if $line2;
}下面是一些undef的哲学化。
一个未初始化的变量警告几乎总是某个地方的逻辑错误,尽管Perl很擅长修复它。如果您正在获得这些信息,您应该查找以下内容:
undef的东西吗?如果是这样的话,我是说它错了,还是参数不好呢?如果调用有效,我可以替换默认值而不出错,比如0或'‘(使用定义的-或//操作符)?我是否需要一个表或子表来代替我的默认值?如果我不能使用默认值,那么我的逻辑有什么问题呢?undef。我的索引或键是坏的吗?如果不是,我应该自己将这些条目设置为默认值、边界-检查数组的索引,还是检查散列元素exists是否是哈希元素?否则,适用1.中的标准。一般来说,除非您的代码应该发出警告(例如,您向其添加了一个warn ),否则警告意味着某些事情与您预期的不一样。你应该看看为什么,而不只是隐藏诊断。
https://stackoverflow.com/questions/14398943
复制相似问题