2016/09/26(月) [n年前の日記]
#1 [prog] Perlのダメ文字で試行錯誤
Windows10 x64 + ActivePerl 5.8.9 build 827 で、日本語を含むディレクトリ名に対してファイルテスト演算子が機能するのかどうかをテスト。
以下のディレクトリ名でディレクトリを作って動作確認。
test_filetest.pl というファイル名で保存して実行。
ダメだった。こういうのは Ruby でやることにしよう…。
以下のディレクトリ名でディレクトリを作って動作確認。
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 でやることにしよう…。
[ ツッコむ ]
以上です。