【问题标题】:Open file in perl and STDERR contents problems在 perl 和 STDERR 内容问题中打开文件
【发布时间】:2013-07-13 12:40:24
【问题描述】:

我正在尝试为 perl 文件上传脚本编写一些单元测试。我对 perl 还是很陌生,所以在实现我期望的代码结果时遇到了一些问题。

基本上,我的想法是,我可以将 test_only 属性与请求一起传递,该属性将告诉脚本仅抓取系统上已有的文件,而不是尝试使用上传的文件。

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

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

我确定我只是遗漏了一些关于 perl 如何打开文件的基本知识。任何帮助将不胜感激。谢谢:)

这是我的代码的适当sn-p:

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);

【问题讨论】:

    标签: perl unit-testing file-upload


    【解决方案1】:

    由于> 模式,您打开了$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>)) { ... }
    

    【讨论】:

    • 感谢您的帮助。这个答案让我到了那里。我实际上正在为这段代码编写一个新 API 的测试,所以我对使用一些旧标准并不感到惊讶。
    猜你喜欢
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2012-11-04
    • 2012-07-10
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多