【问题标题】:How to test if PerlIO::fse works on file test operators?如何测试 PerlIO::fse 是否适用于文件测试运算符?
【发布时间】:2011-11-25 22:36:15
【问题描述】:
#!/usr/local/bin/perl
use warnings;
use strict;
use utf8;
use Encode qw(encode);
my $dir = '/data/Delibes, Léo';

if ( -d $dir ) {
    print "OK\n";
}

if ( -d encode 'utf8', $dir ) {
    print "OK\n";
}

这会打印 2 次 OK;我想这是因为 Perl 在内部将 $dir 存储为 utf8。

我有办法检查PerlIO::fse 是否对文件测试运算符有影响,只要 perl 和文件系统存储在utf8 中?


编辑:

#!/usr/local/bin/perl
use warnings;
use 5.014;
binmode STDOUT, 'utf8';
use utf8;

my $dir1 = 'é';
my $dir2 = chr(0xE9);

opendir my $dh1, $dir1 or warn '1: ', $!;
say "OK1" if -d $dir1;
opendir my $dh2, $dir2 or warn '2: ', $!;
say "OK2" if -d $dir2;

utf8::upgrade( $dir1 );
utf8::upgrade( $dir2 );

opendir my $dh3, $dir1 or warn '3: ', $!;
say "OK3" if -d $dir1;
opendir my $dh4, $dir2 or warn '4: ', $!;
say "OK4" if -d $dir2;

# OK1
# 2: Datei oder Verzeichnis nicht gefunden at ./temp1.pl line 12.
# OK3
# OK4

也许我还没有完全理解PerlIO::fse 的工作原理——在这个例子中我看不到PerlIO::fse 的任何效果:

#!/usr/local/bin/perl
use warnings;
use 5.014;
binmode STDOUT, 'utf8';
use utf8;
use PerlIO::fse 'utf-8';

my $dir1 = 'é';
my $dir2 = chr(0xE9);

opendir my $dh1, $dir1 or warn '1: ', $!;
say "OK1" if -d $dir1;
opendir my $dh2, $dir2 or warn '2: ', $!;
say "OK2" if -d $dir2;

# OK1                                                                                       
# 2: Datei oder Verzeichnis nicht gefunden at ./temp1.pl line 13. 

【问题讨论】:

    标签: perl encoding utf-8 perl-io


    【解决方案1】:

    测试:

    my $file_name = chr(0xE9);  # e acute.
    utf8::downgrade($file_name);
    
    my $file_name = chr(0xE9);
    utf8::upgrade($file_name);
    

    如果不是首先进行 UTF-8 编码,第一个将在 UTF-8 语言环境中产生垃圾。

    如果不先编码,第二个会在其他语言环境中产生垃圾。

    (它们应该是相同的,但是在大多数/所有内置文件中都有一个错误,它会阻止您正确测试它。)

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多