您好我正在尝试编译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;"
请有人帮助我。谢谢。
答案 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开发框架,例如Dancer和Mojolicious。我强烈建议查看其中一个而不是滚动自己的文件下载脚本。如果您正在尝试播放视频流(如提及vlc-plugin
提示),那么这比简单的文件下载更复杂。