如何正确声明全局变量?

时间:2013-08-16 09:31:40

标签: perl variables declaration

ALL,

考虑这段代码:

our $classwork = 0;
while( <INFILE> )
{
    chomp;
    next if $. == 1;
    if( $year >= 1992 && $year <= 1995 )
    {
        $classwork = (split( /,/ ))[6];
        print "Classwork is: ", $classwork, "\n";
    }
    if( $year >= 1996 && $year <= 2001 )
    {
        $classwork = (split( /,/ ))[-1];
    }
    print "Classwork is: ", $classwork, "\n";
    if( $year == 2002 )
    {
        $classwork = (split( /,/ ))[-2];
    }
    if( $year == 2003 || $year == 2004 )
    {
        $classwork = (split( /,/ ))[23];
    }
    if( $year >= 2005 && $year <= 2009 )
    {
        $classwork = (split( /,/ ))[22];
    }
    if( $year >= 2010 && $year <= 2012 )
    {
        $classwork = (split( /,/ ))[20];
    }
    print "Classwork is: ", $classwork, "\n";
    $line = <STDIN>;
}

最后一个print语句不想打印变量。即使我将其声明为“我们的”或只是对声明进行评论。 更奇怪的是它只在第一次迭代时发生。该文件有几千条记录,在第一次迭代时,只有变量未定义。所有后续电话都很好。

知道发生了什么事吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

您没有为我们提供足够的信息来为我们自己复制问题,但最可能的情况是文件的第一行不包含正在处理的任何$year的格式正确的数据用。也许第一行是标题?

另一种可能性是,在$year循环的第一次传递中可能未设置while,因此您永远不会输入设置if$classwork的任何$year块然后它会在循环中的稍后点设置。由于您没有显示$classwork的设置位置或方式,我们无法说明这是否是问题。

为了获得最佳答案,通常最好提供完整的,可运行的示例代码,以尽可能少的额外代码演示您的问题。 (根据我的经验,这样的例子通常不超过15-20行。)这样做的另一个好处是,在找到演示它的最小可能程序的过程中,你经常会发现问题。

此外,没有明显的理由要求our需要全球化。在其当前声明中将my更改为my $classwork不应影响您显示的任何代码,我肯定会考虑将while移至{{1}}循环内,除非有一些预期的条件,它不应该在每次传递时重新分配,而应该保留其值从一次迭代到下一次迭代。

相关问题