https://www.mkamimura.com/2019/08/Perl-Directory-Manipulation-Move-directory-chdir-glob-angle-brackets-home-directory.html
ごもっともだと思います。

Wide character in print at と日本語ファイル名が文字化けする2点を修正したものです。

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use v5.18;
use Cwd;
use Encode;

use Encode::Locale;
binmode STDOUT, ':encoding(console_out)';

if ($^O eq 'darwin') {
    require Encode::UTF8Mac;
    $Encode::Locale::ENCODING_LOCALE_FS = 'utf-8-mac';
}

say '1.';

print "ディレクトリ名を入力: ";
chomp(my $dir = <STDIN>);

if ($dir =~/^\s*$/) {
    chdir or die "cannot chdir to home directory: $!";
} else {
    chdir $dir or die "cannot chdir to $dir: $!";
}

say 'The current working directory is ', getcwd();

for (sort <*>) {
    say decode locale_fs => $_;
}
# diff -u mason/note/2019/09/a-code-orig.pl mason/note/2019/09/a-code.pl
--- mason/note/2019/09/a-code-orig.pl   2019-09-04 13:55:07.145300000 +0900
+++ mason/note/2019/09/a-code.pl        2019-09-04 13:59:05.276605000 +0900
@@ -1,10 +1,20 @@
 #!/usr/bin/env perl
+
 use strict;
 use warnings;
 use utf8;
 use v5.18;
 use Cwd;
+use Encode;

+use Encode::Locale;
+binmode STDOUT, ':encoding(console_out)';
+
+if ($^O eq 'darwin') {
+    require Encode::UTF8Mac;
+    $Encode::Locale::ENCODING_LOCALE_FS = 'utf-8-mac';
+}
+
 say '1.';

 print "ディレクトリ名を入力: ";
@@ -19,5 +29,5 @@
 say 'The current working directory is ', getcwd();

 for (sort <*>) {
-    say $_;
+    say decode locale_fs => $_;
 }

Windows や Mac での下記は、整っていないと言わざるをえないと思います。

https://rt.perl.org/Public/Bug/Display.html?id=134286
- command line arguments
- filenames across many different operators
- process creation (system, exec, readpipe/qx(), pipe open())
- environment variables
- console (maybe)
- many similar changes in bundled modules

Perl5流のバイト列に拘るにしても、整備する必要を感じます。

ここが問題で、ファイル名を渡す・操作する・返す形のモジュールにおいて、ASCIIのファイル名を扱う限り問題が起きませんが
日本語を含むと問題が起きるので、そのモジュールの使用を躊躇えざるをえません。

File::FindFile::Find::Rule などのちょっとしたこを簡単にこなせるPerl5らしいモジュールがありますが、ASCII以外だと躊躇います。
https://randomgeekery.org/2019/06/01/weighing-files-with-python/

書き捨ての簡単なファイル操作を行うスクリプトにおいても ASCII 外では perl5 では、分かっていても面倒だと思います。
(Linux などを UTF-8 で運用していたり、Windows のベータ機能 CP_UTF8 では問題ないのですが)

コメントする

perl adv
perl adv