【发布时间】:2016-04-27 20:50:05
【问题描述】:
我对 Perl 完全陌生,我有一段代码返回了一个空文件处理程序。
my $md5dir = "...plib/test/md5sum"; #IN MY PROG, IS THE FULL PATH
opendir( DIR, $md5dir ) or die "Can't open directory $md5dir: $!";
my @md5files = grep !/^\.\.?$/, readdir(DIR);
closedir(DIR);
if ( scalar @md5files < 1
|| scalar @md5files > 8
|| ( scalar @md5files % 2 != 0 ) )
{
print "Incorrect amount of files in directory. Aborting.\n";
exit 1;
}
else {
for ( my $i = 0; ( $i < scalar @md5files / 2 ); $i++ ) {
my $file1 = $md5files[$i];
open( my $fh1, $file1 ) or die "Fail to open file $file1 $!";
my $file2 = $md5files[ $i + 3 ];
open( my $fh2, $file2 ) or die "Fail to open file $file2 $!";
print "2.", $file1, " ", $file2, "\n";
my $first1 = substr( $file1, 0, 4 );
my $first2 = substr( $file2, 0, 4 );
if ( ( $first1 cmp $first2 ) == 0 ) {
if ( eof $fh1 ) { print "No lines\n"; }
else { my $line1 = <$fh1>; print "$line1\n"; }
if ( eof $fh2 ) { print "No lines2\n"; }
else { my $line2 = <$fh2>; print "$line2\n"; }
close $fh1;
close $fh2;
}
} # for
} # else
输出是这样的:
2.SAM5_27-04-2016_11:21:20.md5 SAM5_27-04-2016_11:20:11.md5
No lines
No lines2
2.SAM6_27-04-2016_11:18:25.md5 SAM6_25-04-2016_10:38:38.md5
No lines
No lines2
2.SAM4_27-04-2016_11:19:06.md5 SAM4_27-04-2016_11:17:22.md5
No lines
No lines2
在 md5sum 的目录中:
:md5sum>ls -la
total 16
drwxrwxr-x 2 ateam ateam 4096 Apr 27 11:24 ./
drwxrwxr-x 4 ateam ateam 4096 Apr 27 11:24 ../
-rw-rw-r-- 1 ateam ateam 63 Apr 27 11:17 SAM4_27-04-2016_11:17:22.md5
-rw-rw-r-- 1 ateam ateam 63 Apr 27 11:19 SAM4_27-04 2016_11:19:06.md5
-rw-rw-r-- 1 ateam ateam 63 Apr 27 11:20 SAM5_27-04-2016_11:20:11.md5
-rw-rw-r-- 1 ateam ateam 0 Apr 27 11:21 SAM5_27-04-2016_11:21:20.md5
-rw-rw-r-- 1 ateam ateam 63 Apr 25 10:38 SAM6_25-04-2016_10:38:38.md5
-rw-rw-r-- 1 ateam ateam 63 Apr 27 11:18 SAM6_27-04-2016_11:18:25.md5
有人可以解释为什么文件处理程序是空的吗?我验证了文件的打印。它们都可以很好地打印到数组中,并且文件处理程序正在打开...由于文件不为空,还有什么问题??? (好吧,除了那个……)
只是为了查看文件...以防万一。 打开我得到的第一个文件:
03c0cf2ab0da62832bfc6970d4505746 SAM4_27-04-2016_11:17:22.csv
编辑::: 我对文件稍作调整:
if (($first1 cmp $first2) == 0) {
if (tell($fh1) == -1){ print "No lines\n";}
else {my $line1= <$fh1>; print "$line1\n"; }
if (eof $fh2){ print "No lines2\n";}
else { my $line2= <$fh2>; print "$line2\n"; }
close $fh1; close $fh2;
}
而是得到了这个输出:
2.SAM5_27-04-2016_11:21:20.md5 SAM5_27-04-2016_11:20:11.md5
Use of uninitialized value in concatenation (.) or string at mulftptest line 53.
No lines2
2.SAM6_27-04-2016_11:18:25.md5 SAM6_25-04-2016_10:38:38.md5
Use of uninitialized value in concatenation (.) or string at mulftptest line 53.
No lines2
2.SAM4_27-04-2016_11:19:06.md5 SAM4_27-04-2016_11:17:22.md5
Use of uninitialized value in concatenation (.) or string at mulftptest line 53.
No lines2
基本上,我知道这告诉我我正在尝试使用“空”变量。但是,我不明白为什么它是空的。
【问题讨论】:
-
@eballes 它默认为'
-
'<:encoding>
-
我试过了,没用。
-
您确定文件已打开?如果文件关闭,
eof返回 0。 -
@HunterMcMillen:错了。 OP 表示根据文件的前四个字符对文件进行配对。
readdir返回的值可能按其名称的词法顺序传递,因此它们应该以$md5files[$i]和$md5files[$i+1]访问,同时循环将$i增加2。您的建议期望每对的第二个文件向后排序,例如SAM4_1、SAM5_1、SAM6_1、SAM6_2、SAM5_2、SAM4_2;而 OP 的代码适用于SAM4_1、SAM5_1、SAM6_1、SAM4_2、SAM5_2、SAM6_2。
标签: perl null file-handling