Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl文件上传。如何多次访问filehandle?_Perl_Upload_Filehandle - Fatal编程技术网

Perl文件上传。如何多次访问filehandle?

Perl文件上传。如何多次访问filehandle?,perl,upload,filehandle,Perl,Upload,Filehandle,我试图检测上传的文件是否是有效的UTF-8,并且只有在这之后才能对其内容进行一些操作。它可以检测非UTF-8文件,但如果文件是有效的UTF-8,则没有要处理的内容。while(){}循环中没有要处理的数据。我的错在哪里 use utf8; use CGI qw(:all -utf8); use Encode; my $q = new CGI; my $file = $q->param('importfile'); my $file_handle = $

我试图检测上传的文件是否是有效的UTF-8,并且只有在这之后才能对其内容进行一些操作。它可以检测非UTF-8文件,但如果文件是有效的UTF-8,则没有要处理的内容。
while(){}
循环中没有要处理的数据。我的错在哪里

use utf8;
use CGI qw(:all -utf8);
use Encode;

my $q           = new CGI;

my $file        = $q->param('importfile');
my $file_handle = $q->upload('importfile');
my $fhtest      = do {
        local $/;
        <$file_handle>;
};

my $utf8;
eval { $utf8 = decode( "utf8", $fhtest, Encode::FB_CROAK ) };
if ($@) {
        die 'Not a valid UTF-8 file';
}

binmode $file_handle, ':encoding(UTF-8)';
while (<$file_handle>) {
        chomp();
        # my code here
}
使用utf8;
使用CGI qw(:all-utf8);
使用编码;
my$q=新的CGI;
my$file=$q->param('importfile');
我的$file_handle=$q->upload('importfile');
我的$fhtest=do{
本地$/;
;
};
我的$utf8;
eval{$utf8=decode(“utf8”,$fhtest,Encode::FB_CROAK)};
如果($@){
“不是有效的UTF-8文件”;
}
binmode$file_handle':编码(UTF-8)';
而(){
chomp();
#我的代码在这里
}

在创建
$fhtest
时,您已经在第一个循环中读取了整个文件句柄。如果要回到开头,可以使用:


当您使用
readline
(又称
)时,您将在您停止的位置后阅读下一行。你在文件的末尾停了下来

当然,您可以使用
seek
回放文件句柄(假设它不是管道),但为什么要再次读取文件?你已经把整个东西都记在了记忆里,而且它也已经被解码了!把它分成几行

 my $file_contents; { local $/; $file_contents = <$file_handle>; }

utf8::decode($file_contents)
   or die 'Not a valid UTF-8 file';

for (split /^/m, $file_contents, -1) {
    chomp;
    ...
}

我避免了
do
,因为这会导致在内存中创建文件的额外副本。

谢谢!第一种方法是使用
seek
进行搜索。尝试了第二种方法,打开了一个假文件句柄-在
while
循环中没有要处理的数据。这就是策略,
$fhtest
确实包含数据,但不知何故它没有传递到假文件句柄。使用
Encode::FB_CROAK | Encode::LEAVE_SRC
修复了该问题。固定的。
open my $fake_fh, '<', \$fhtest;
while( <$fake_fh> ) { 
    ....
}
 my $file_contents; { local $/; $file_contents = <$file_handle>; }

utf8::decode($file_contents)
   or die 'Not a valid UTF-8 file';

for (split /^/m, $file_contents, -1) {
    chomp;
    ...
}
for (split /\n/, $file_contents) {
    ...
}