mieki256's diary



2016/09/26(月) [n年前の日記]

#1 [prog] Perlのダメ文字で試行錯誤

Windows10 x64 + ActivePerl 5.8.9 build 827 で、日本語を含むディレクトリ名に対してファイルテスト演算子が機能するのかどうかをテスト。

以下のディレクトリ名でディレクトリを作って動作確認。
ascii only dir
日本語ディレクトリ
日本語ディレクトリ ―ダッシュはダメ文字―
日本語ディレクトリ竹はパイプ文字竹
日本語ディレクトリ表は0x5c表

test_filetest.pl というファイル名で保存して実行。
#!/usr/bin/perl -w
#
# 日本語ファイル名に対してファイルテスト演算子が使えるのか動作チェック
# ディレクトリ名が取得できるか、ファイルテスト演算子が使えるのかを確認。
# SJISのダメ文字が入ってると動作が怪しくなることを確認する。

use strict;
use warnings;
use utf8;
use Encode qw/encode decode/;

use open IO => ":encoding(cp932)";
binmode STDOUT, ':encoding(cp932)';

sub d($) { decode('cp932', shift) }
sub e($) { encode('cp932', shift) }


# ----------------------------------------
# glob で取得

my @files = glob("*");
@files = map { d($_) } @files;
print join("\n", @files), "\n";
print '-' x 40, "\n";

# 出力結果
#
# 日本語ディレクトリ竹はパイプ文字竹
# 日本語ディレクトリ
# ascii only dir
# test_filetest.pl
#
# ダメ文字が含まれてるいくつかのディレクトリ名は取得できていない

# ----------------------------------------
# opendir で取得

my $dirname = ".";
opendir my $dh, $dirname or die "$! : $dirname";
@files = grep { !m/^\.{1,2}$/g } readdir $dh;   # . と .. は読み飛ばす
@files = map { d($_) } @files;
closedir $dh;

# ファイルテスト演算子でチェック

foreach my $s (@files) {
    if ( -f e($s) ) {
        print "[File] ", $s, "\n";
    } elsif ( -d e($s) ) {
        print "[Dir]  ", $s, "\n";
    } else {
        print "[Unknown]  ", $s, "\n";
    }
}

# 出力結果
#
# [Dir]  ascii only dir
# [File] test_filetest.pl
# [Dir]  日本語ディレクトリ
# [Unknown]  日本語ディレクトリ ―ダッシュはダメ文字―
# [Dir]  日本語ディレクトリ竹はパイプ文字竹
# [Unknown]  日本語ディレクトリ表は0x5c表
#
# ダメ文字が含まれた一部のディレクトリ名に対しては
# ファイルテスト演算子が働いてないように思われる。

ダメだった。こういうのは Ruby でやることにしよう…。

以上です。

過去ログ表示

Prev - 2016/09 - Next
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project