Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 如何在使用HTML::Tree解析后将数据标记为UTF-8?_Perl_Utf 8_Html Parsing_Html Tree - Fatal编程技术网

Perl 如何在使用HTML::Tree解析后将数据标记为UTF-8?

Perl 如何在使用HTML::Tree解析后将数据标记为UTF-8?,perl,utf-8,html-parsing,html-tree,Perl,Utf 8,Html Parsing,Html Tree,我编写了一个脚本,在这个脚本中,我在UTF-8编码的HTML文件中含糊不清,然后用语法将其解析为树。问题是,解析后的字符串不再标记为UTF-8 由于\u utf8\u on()不是设置标志的推荐方式,我正在寻找合适的方式 我的简化代码示例: #!/usr/bin/perl use strict; use warnings; use 5.010; use utf8::all; use autodie; use HTML::Tree; use Encode qw/is_utf8/; my $fi

我编写了一个脚本,在这个脚本中,我在UTF-8编码的HTML文件中含糊不清,然后用语法将其解析为树。问题是,解析后的字符串不再标记为UTF-8

由于
\u utf8\u on()
不是设置标志的推荐方式,我正在寻找合适的方式

我的简化代码示例:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use utf8::all;
use autodie;
use HTML::Tree;
use Encode qw/is_utf8/;

my $file = shift;
my $tree;

if ($file) {
    my $content = slurp_in( 'file' => $file );
    $tree = html_tree('content' => $content);
} else {
    die "no file";
}

my $title = $tree->look_down(_tag => 'title');
$title = $title->as_HTML('');

if ( is_utf8( $title ) ) {
    say "OK: $title";
} else {
    say "NOT OK: $title";
}

## SUBS
##
sub slurp_in {
    my %v = @_;

    open(my $fh, "<:utf8", $v{file}) || die "no $v{file}: $!";
    local $/;
    my $content = (<$fh>);
    close $fh;

    if ($content) {
        return $content;
    } else {
        die "no content in $v{file} !";
    }
}

sub html_tree {
    my %v = @_;
    my $tree = HTML::Tree->new();
    $tree->utf8_mode(1); ## wrong call here, no such method, but no warnings on it!
    $tree->parse( $v{content} );

    if ($tree) {
        return $tree;
    } else {
        die "no tree here";
    }
}
#/usr/bin/perl
严格使用;
使用警告;
使用5.010;
使用utf8::all;
使用自动模具;
使用HTML::Tree;
使用编码qw/is_utf8/;
我的$file=shift;
我的美元树;
如果($file){
我的$content=slurp_in('file'=>$file);
$tree=html_tree('content'=>$content);
}否则{
死“无文件”;
}
我的$title=$tree->look_down(_tag=>'title');
$title=$title->as_HTML(“”);
如果(是utf8($title)){
说“好:$title”;
}否则{
说“不好:$title”;
}
##潜艇
##
子slurp_in{
我的%v=@;

打开(我的$fh,"你的代码过于复杂,你使用utf8::all并手动解码,然后立即调用那个奇怪的方法。反问一下,你希望通过这种方式实现什么?我没有耐心去找出细节哪里出了问题,哪里出了问题,特别是因为你没有发布任何你的程序无法完成预期的输入ed,所以我把它大大简化为一个更简单的方法。这个方法有效:

#!/usr/bin/env perl
use 5.010;
use strict;
use warnings FATAL => ':all';
use File::Slurp qw(read_file);  # autodies on error
use HTML::Tree qw();

my $file = shift;
die 'no file' unless $file;

my $tree = HTML::Tree->new_from_content(
    read_file($file, binmode => ':encoding(UTF-8)')
);

my $title = $tree->look_down(_tag => 'title');
$title->as_HTML(''); # returns a Perl string

你的代码过于复杂,你使用utf8::all并手动解码,然后立即调用那个奇怪的方法。反问一下,你希望通过这种方式实现什么?我没有耐心去找出细节哪里出了问题,哪里出了问题,特别是因为你没有发布任何你的程序无法完成预期的输入ed,所以我把它大大简化为一个更简单的方法。这个方法有效:

#!/usr/bin/env perl
use 5.010;
use strict;
use warnings FATAL => ':all';
use File::Slurp qw(read_file);  # autodies on error
use HTML::Tree qw();

my $file = shift;
die 'no file' unless $file;

my $tree = HTML::Tree->new_from_content(
    read_file($file, binmode => ':encoding(UTF-8)')
);

my $title = $tree->look_down(_tag => 'title');
$title->as_HTML(''); # returns a Perl string