0

我正在尝试为 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);
4

1 回答 1

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:句柄、模式和名称(不要连接模式和名称,除了古老的 perls)。

我也很惊讶您正在使用read. 您可以通过以下方式获得类似的效果

local $/ = \$bufsize;
while (defined(my $buffer = <$TMPFILE>)) { ... }
于 2013-07-15T15:32:31.573 回答