嗨,我正在尝试编译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
,我正在尝试播放视频文件.但我没有得到我错的地方.但是我得到的错误
Can't modify non-lvalue subroutine call in read at download.cgi line 39, near "$cur;"
请有人帮帮我.谢谢.
第39行必须是这一行:
read FILE, min(1024*16) , $end-$cur;
因为这是唯一一次$cur;
出现在发布的代码中.
如果查看文档read
,您会发现第二个参数必须是标量变量,用于存储读取数据.
min(1024*16)
不是标量变量.
这是一个函数调用.
正如错误消息所述,所讨论的函数是"非左值子程序"."左值"是一个值,它可以出现在表达式的左侧,通常意味着左值是可写的.输出min
不是.即使它是一般的,也不会出现这种情况,因为输入min
是常量,而常量永远不可写.如果是,他们就不会被称为"不变".
我认为你可能想要的是
read FILE, $buf, 1024*16, $end-$cur;
这将读取16kb FILE
,从偏移量开始$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
提示),那么这比简单的文件下载更复杂.