使用perl tie :: file和utf编码文件

前端之家收集整理的这篇文章主要介绍了使用perl tie :: file和utf编码文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我可以将Tie :: File与utf编码的输出文件一起使用吗?我不能让这个工作正常.
我要做的是打开这个utf编码文件,从文件删除匹配字符串并重命名文件.

码:

use strict;
use warnings;
use Tie::File;
use File::Copy;

my ($input_file) = qw (test.txt);

open my $infh,"<:encoding(UTF-16LE)",$input_file or die "cannot open '$input_file': $!";

for (<$infh>) {
    tie my @lines,"Tie::File",$_;
    shift @lines if $lines[0] =~ m/MyHeader/;
    untie @lines;
    my ($name) = /^(.*).csv/i;
    move($_,$name . ".dat");
}

close $infh
    or die "Cannot close '$input_file': $!";

代码:(更新)

my ($input_file) = qw (test.txt);
my $qfn_in = $input_file;
my $qfn_out = $qfn_in . ".dat";

open(my $fh_in,"<:raw:perlio:encoding(UTF-16le):crlf:utf8",$qfn_in)
   or die("Can't open \"$qfn_in\": $!\n");

open(my $fh_out,">:raw:perlio:encoding(UTF-16le):crlf:utf8",$qfn_out)
   or die("Can't open \"$qfn_out\": $!\n");

while (<$fh_in>) {
   next if $. == 1 && /MyHeader/; 
   print($fh_out $_)
      or die("Can't write to \"$qfn_out\": $!");
}

close($fh_in);
close($fh_out) or die("Can't write to \"$qfn_out\": $!");

rename($qfn_out,$qfn_in)
   or die("Can't rename: $!\n");

解决方法

my $qfn_in = ...;
my $qfn_out = $qfn_in . ".tmp";

open(my $fh_in,$qfn_out)
   or die("Can't open \"$qfn_out\": $!\n");

while (<$fh_in>) {
   next if $. == 1 && /MyHeader/;
   print($fh_out $_)
      or die("Can't write to \"$qfn_out\": $!");
}

close($fh_in);
close($fh_out) or die("Can't write to \"$qfn_out\": $!");

rename($qfn_out,$qfn_in)
   or die("Can't rename: $!\n");

(:perlio和:utf8是当时存在的bug的解决方法.)

猜你在找的Perl相关文章