首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在级联(.)中使用未初始化值(.)或字符串位于./Merge_gcov_generalised.pl行226,<FILE2>行284046 (#1)

在级联(.)中使用未初始化值(.)或字符串位于./Merge_gcov_generalised.pl行226,<FILE2>行284046 (#1)
EN

Stack Overflow用户
提问于 2013-01-18 12:26:12
回答 2查看 2.4K关注 0票数 1

我编写了一个perl脚本来合并来自不同机器的gcov文件。下面是我为合并而编写的子例程。

代码语言:javascript
复制
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);
    }

合并是正确的,但是在合并之后,我得到了以下错误.

代码语言:javascript
复制
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“,

EN

回答 2

Stack Overflow用户

发布于 2013-01-18 12:49:47

如果您想要做的就是消除您已经期待并已经考虑到的特定警告,那么您所要做的就是:

代码语言:javascript
复制
{    no warnings 'uninitialized';
     # **Small** bit of code causing the problem.
     say "A string and $probably_undefined";
}

我要强调的原因是,小代码是因为Perl没有1000个警告类别可以通过语用打开和关闭。它有几个相当广泛的类别,如果你离开太大的武器,一个空间会咬你。这样做的目的是查看每一种警告条件,并确定未初始化的值是否有任何效果--或者至少可以解释一下。

票数 0
EN

Stack Overflow用户

发布于 2014-09-23 03:04:50

您测试未初始化的行之一或另一行,但从未使用该信息,因此您将在最后的else中打印一个与换行符连接的else;这是警告的来源。

实际上,您的gcov文件中有一堆多余的换行符,这是由一个文件首先耗尽造成的,每个不匹配的行有一个。它们之所以有效,仅仅是因为gcov非常宽容它所接受的内容,或者因为gcov在看到第一个空换行符时停止了对输入的静默读取。第一个是伟大的,第二个是非常糟糕的。

要解决这个问题,我们需要弄清楚我们期望在哪里有一个undef,以及当我们找到它时应该做些什么。当我们到达每个文件的末尾时,这段代码可以在$line1$line2中生成$line2。让我们看看如何使用这些工具来查看undef在哪里可以使用,哪些地方不合适。

  1. 测试这两行都是假的(例如,undef):这是对undef的一个很好的使用。
  2. 设置$flag:好用法,但逻辑错误,因为您再也不使用$flag了。
  3. 模式匹配:很好的用法,因为模式匹配什么都不应该(也不应该做)失败,这对您的代码是正确的。
  4. 打印一个可能是undef的行:不好的用法,因为这将生成警告并输出额外的空换行符。

由于模式匹配对于undef都会失败,所以您可以跳过设置$flag的代码,使最后一个else看起来如下:

代码语言:javascript
复制
...
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很擅长修复它。如果您正在获得这些信息,您应该查找以下内容:

  1. 我是在调用返回undef的东西吗?如果是这样的话,我是说它错了,还是参数不好呢?如果调用有效,我可以替换默认值而不出错,比如0或'‘(使用定义的-或//操作符)?我是否需要一个表或子表来代替我的默认值?如果我不能使用默认值,那么我的逻辑有什么问题呢?
  2. 如果不是这样,我是在引用未初始化的数组或哈希条目吗?Perl将自动将这些条目生动化,并将它们设置为undef。我的索引或键是坏的吗?如果不是,我应该自己将这些条目设置为默认值、边界-检查数组的索引,还是检查散列元素exists是否是哈希元素?否则,适用1.中的标准。
  3. 如果这两种情况都没有,我有一个未初始化的标量变量。为什么没有初始化呢?我应该把它初始化成什么?我忘了做什么假设(不将标量初始化为已知值)?

一般来说,除非您的代码应该发出警告(例如,您向其添加了一个warn ),否则警告意味着某些事情与您预期的不一样。你应该看看为什么,而不只是隐藏诊断。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14398943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档