我有一个脚本,可以运行并使用每日CSV文件中的数据更新每月CSV文件。我要添加的是一个检查,如果当前天数日期在列的文件中,那么A'那意味着数据已经从日常文件中复制过来,所以不做任何事情并退出。但是,如果今天的日期不在列A' A'然后复制数据并附加到月度文件。到目前为止我所做的工作直到我尝试附加数据。然后,即使今天的日期存在,它也总是附加。
我无法检查上次访问文件的时间,因为其他人访问该文件。
#!/usr/local/bin/perl
#use warnings;
use strict;
use POSIX 'mktime';
use POSIX 'strftime';
my @dateParts = localtime ();
my ($day, $month, $year) = @dateParts[3 .. 5];
$year += 1900;
$month += 1;
open ( OUTPUT, '+<', "C:\\temp\\MONTHLY.CSV" )
or die "Cannot open file $!\n";
while ( defined ( my $line = <OUTPUT> ) ) {
chomp $line;
my ($Date) = split ',', $line;
if ( $Date eq "$day $month $year" ) {
close OUTPUT;
exit
print "\ file has already been updated today";
}
elsif ( $Date ne "$day $month $year" ) {
#It works fine until I try this
#open (INPUT, "C:\\temp\\DAILY.CSV")
# or die "Cannot open file $!\n";
#open (OUTPUT, '>>', "C:\\temp\\MONTHLY.CSV")
# or die "Cannot open file $!\n";
#<INPUT>;
#while ( <INPUT> ) {
# print OUTPUT;
#}
}
}
#close INPUT;
#close OUTPUT;
答案 0 :(得分:0)
else
块实际上只有一种可能的方式,即如果与if
块的第一部分相关联的条件为假。
如果$Date
不等于"$day $month $year"
,唯一可能是假的方式。
在if语句之前放置一个print语句,如下所示:
print "\$Date ($Date)\n",
"\$day \$month \$year ($day $month $year)\n";
当该行执行时,您将能够快速确定不匹配的位置。一定是他们不匹配的情况。为什么他们不匹配,我们无法确定,因为我们还没有看到您的输入数据。但是,如果掌握了这些信息,你应该能够推断出你出错的地方。
其他几个问题:elsif
子句可能只是一个else
,没有任何条件,因为逻辑规定如果$Date eq "$day $month $year"
为false,那么$Date ne "$day $month $year"
必须是真。
下一个问题是,您拨打exit
后会立即终止该计划,使下一行“print "\ file has already been updated today";
”无法访问代码。
另一个突出的问题是你打开MONTHLY.CSV文件进行读/写,你正在调用文件句柄OUTPUT,但你只是从句柄中读取。当您开始写入MONTHLY.CSV时,您已经在追加模式下重新打开了该文件。您也可以将第一个文件句柄调用与输入相关的内容,并在读取模式下打开它,而不是读/写。