当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《无法修改在download.cgi第39行读取的非左值子程序调用,靠近"$cur;"》经验,为你挑选了1个好方法。

嗨,我正在尝试编译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;"

请有人帮帮我.谢谢.



1> Dave Sherohm..:

第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提示),那么这比简单的文件下载更复杂.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有