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语句不想打印变量。即使我将其声明为“我们的”或只是对声明进行评论。 更奇怪的是它只在第一次迭代时发生。该文件有几千条记录,在第一次迭代时,只有变量未定义。所有后续电话都很好。
知道发生了什么事吗?
谢谢。
答案 0 :(得分:0)
您没有为我们提供足够的信息来为我们自己复制问题,但最可能的情况是文件的第一行不包含正在处理的任何$year
的格式正确的数据用。也许第一行是标题?
另一种可能性是,在$year
循环的第一次传递中可能未设置while
,因此您永远不会输入设置if
和$classwork
的任何$year
块然后它会在循环中的稍后点设置。由于您没有显示$classwork
的设置位置或方式,我们无法说明这是否是问题。
为了获得最佳答案,通常最好提供完整的,可运行的示例代码,以尽可能少的额外代码演示您的问题。 (根据我的经验,这样的例子通常不超过15-20行。)这样做的另一个好处是,在找到演示它的最小可能程序的过程中,你经常会发现问题。
此外,没有明显的理由要求our
需要全球化。在其当前声明中将my
更改为my $classwork
不应影响您显示的任何代码,我肯定会考虑将while
移至{{1}}循环内,除非有一些预期的条件,它不应该在每次传递时重新分配,而应该保留其值从一次迭代到下一次迭代。