我可以将Tie :: File与utf编码的输出文件一起使用吗?我不能让这个工作正常.
我要做的是打开这个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的解决方法.)