无法在download.cgi第39行读取非左值子程序调用,接近" $ cur;"

时间:2015-12-27 08:32:41

标签: perl

您好我正在尝试编译perl程序但是它给出了错误。

这是我的代码

#!/usr/bin/perl

require './filemin-lib.pl';
use lib './lib';

use File::Basename;
use List::Util qw( min max );
use Cwd 'abs_path';

&ReadParse();

get_paths();

my $file = $cwd.'/'.$in{'file'};
my $size = -s "$file";
my $begin=0;
my $end=$size;
(my $name, my $dir, my $ext) = fileparse($file, qr/\.[^.]*/);

open (FILE, "< $file") or die "can't open $file: $!";
binmode FILE;

print "Content-Type: application/x-vlc-plugin\n";
print "Cache-Control: public, must-revalidate, max-age=0";
print "Pragma: no-cache" ;
print "Content-Disposition: attachment; filename=\"$name$ext\"\n";
print "Content-Transfer-Encoding: binary";
print "Accept-Ranges: bytes";
print "Content-Length:  $end - $begin \n\n";
print "Connection: close"; 

#open (FILE, "< $file") or die "can't open $file: $!";
#binmode FILE;

my $cur=$begin;
seek(FILE,$begin,0);
while(!eof(FILE) && $cur < $end)
{
    read FILE, min(1024*16) , $end-$cur;
    $cur+=1024*16;
}
close FILE;

在我试图在vlc-plugin的帮助下播放视频,我正在尝试播放视频文件。但我没有得到我错的地方。但是我得到了错误< / p>

Can't modify non-lvalue subroutine call in read at download.cgi line 39, near "$cur;"

请有人帮助我。谢谢。

1 个答案:

答案 0 :(得分:6)

第39行必须是这一行:

read FILE, min(1024*16) , $end-$cur;

因为这是$cur;在发布的代码中出现的唯一时间。

如果查看read的文档,您会发现第二个参数必须是标量变量,用于存储读取数据。

min(1024*16)不是标量变量。

这是一个函数调用。

正如错误消息所述,所讨论的函数是“非左值子程序”。 “左值”是一个值,它可以出现在表达式的左侧,通常意味着左值是可写的。 min的输出不是。即使它是一般的,也不会出现这种情况,因为min的输入是一个常量,而常量永远不会可写。如果是,他们就不会被称为“常数”。

认为你可能想要的是

read FILE, $buf, 1024*16, $end-$cur;

这将从FILE读取16kb,从偏移量$end-$cur开始,并将该数据存储在$buf中。但你可能一直试图在那里做其他事情,所以我可能错了,因为这就是你想要的。

我也完全删除了min,因为在单个值上使用它没有意义,除非你已经定义了自己的min函数,它除了返回最小值之外还执行其他操作给它作为参数。 (如果有,那么我建议重命名你的功能,以免混淆未来的维护程序员。)

最后,一般的Perl样板建议:

  • use strict; use warnings; 始终。(除非您有非常具体的理由,否则您明白为什么strict / warnings不喜欢什么你在做什么,你可以清楚地解释为什么你认为无论如何都可以做到这一点。)

  • 不要使用&&ReadParse();)为子呼叫添加前缀。它是Perl 4中不再需要的Perl 4主义,并且具有你可能不知道的副作用,几乎肯定不需要。

  • 使用open和词法文件句柄的三参数形式,而不是旧方法。所以open (my $fh, '<', $file)代替open (FILE, "< $file")。当您从用户输入中获得$file时,这非常重要,这意味着他们可能会向您传递恶意值。

  • 说到始终完整性检查用户输入,然后再使用它来执行打开文件之类的操作。用户输入不值得信任,特别是在网络上,您应该会收到那些试图以创造性方式破坏您的程序的人的恶意输入,这将使他们对正在运行的服务器执行不愉快的事情。

  • 最后,有很多非常好用且易于使用的Web开发框架,例如DancerMojolicious。我强烈建议查看其中一个而不是滚动自己的文件下载脚本。如果您正在尝试播放视频流(如提及vlc-plugin提示),那么这比简单的文件下载更复杂。