在perl和STDERR内容中打开文件问题

时间:2013-07-15 15:21:45

标签: perl unit-testing file-upload

我正在尝试为perl文件上传脚本编写一些单元测试。我仍然是perl的新手,所以我遇到了一些问题,达到了我对代码的期望。

基本上我的思维过程是我可以传递一个test_only属性以及将告诉脚本只是抓取系统上已有文件而不是尝试使用上传文件的请求。

我创建了一个测试文件并将其放在我的output / tmp目录中。我确保将其权限设置为775.它只是一个简单的.txt文件,上面写着“我是一个测试文件”。

我期望目前发生的是,当我运行我的测试脚本时,我应该看到文件的内容打印到错误日志以及对缓冲区的一些引用(所以我可以验证文件是否正确打开)。但是,这不会发生,错误日志中没有任何内容。我想知道文件是否正确打开了?

我确信我只是缺少关于perl如何打开文件的基本信息。任何帮助将不胜感激。谢谢:))

这是我的代码的适当代码段:

my $test_only = 1;
my $tmp_uploads_path = "/home/my_instance/output/tmp/";
if($test_only)
{
    #put simulated file handle and file name here
    $file = "";
    $file_name = "test_file.txt";
}
else
{

    $file = $q->upload('file') 
        || die "No file data sent\n $!";

    $file_name = $q->param('file_name') 
        || die "No file_name sent\n $!";
}

########
#SAVE THE UPLOAD
########
my $bufsize = 1024;    
my $buffer = '';

open(my $TMPFILE, ">".$tmp_uploads_path.$file_name);
binmode $TMPFILE;
print STDERR "=> ".Dumper($TMPFILE)."\n";
while(read ($TMPFILE, $buffer, $bufsize)){
    print STDERR "=> ".Dumper($TMPFILE)."\n";
    print STDERR "=> ".Dumper($buffer)."\n";
    print $TMPFILE $buffer;    
}
close($TMPFILE);

1 个答案:

答案 0 :(得分:3)

由于$TMPFILE模式,您打开>进行写作。因此,你无法从中读取。

你应该始终将use strict; use warnings;放在脚本的顶部,这会提醒你注意这个问题!

你应该打开像

这样的文件
my $name = ...;
open my $fh, "<", $name or die "Can't open $name: $!";

use autodie;
open my $fh, "<", $name;

也就是说,进行适当的错误处理,并使用open的三个arg变体:handle,mode和name(除了古代perls之外,不要使用concat模式和名称)。

我也很惊讶您正在使用read

你可以得到类似的效果
local $/ = \$bufsize;
while (defined(my $buffer = <$TMPFILE>)) { ... }