两个GBK编码(又或者是utf8 utf16)的文件:
- 中文测试.txt
评分 8.8
blah blah
- 中文测试.txt
评价 9.9 分
现在假设我要从两个文本中获取分数,然后按分数建立文件夹,并将文本复制到对应分数的文件夹内
中间可能要做一些处理所以导入的时候转为了 Unicode 编码。
use Encode;
use File::Copy;
grep { getRate_and_Copy( $_ ) } (glob "*.txt");
sub getRate_and_Copy
{
my $file = shift;
local $/ = undef;
open READ, "<:encoding(gbk)", $file or die "$!";
$all = <READ>;
close READ;
if ( $all=~/(\d+\.\d)/ )
{
mkdir $1 if ( ! -e $1 ); #1
copy $file, $1;
}
}
复制出来的文件名却是这样的:
代码: 全选
\File-Copy.pl
\中文.txt
\中文测试.txt
\8.8\脰脨脦脛.txt
\9.9\脰脨脦脛虏芒脢脭.txt
代码确有个不严谨的地方(#1):我处理的文件名和路径应该是GBK的,但是却混杂了Unicode情况下提取的
数字字符,8.8 和 9.9,但是,数字以及"." 在Unicode 和 GBK 编码中不是共通的吗?
如果将
open READ, "<:encoding(gbk)", $file or die "$!";
改为
open READ, "<", $file or die "$!";
则无此问题,即使换成 utf8 也是如此。只要解码为 unicode 再提取数字,建立文件夹,复制示例文件进去,就会乱码