私は、コマンドラインでユーザからの入力として正規表現をとり、その後、現在のディレクトリの下にある特定のファイルを見つけるために、その正規表現を適用するアプリケーションに取り組んでいます。アプリケーションはUTF-8入力をサポートしており、UTF-8でエンコードされたファイル名を見つけることができます。File :: Find :: Ruleで使用する正規表現入力をユーザーがエンコードするのは安全ですか?
use feature qw(say);
use open qw(:std :utf8);
use strict;
use utf8;
use warnings;
use Encode();
use File::Find::Rule;
system 'touch', 'aæ', 'bæ', 'aa'; # some test files,
my $pat = 'æ$';
my $pat_encode = encode($pat);
run_test($pat_encode, 'With encode()');
run_test($pat, 'Without encode()');
my $pat2 = '[æ]$';
my $pat2_encode = encode($pat2);
run_test($pat2_encode, 'With encode()');
sub encode {
return Encode::encode('UTF-8', $_[0], Encode::FB_CROAK | Encode::LEAVE_SRC);
}
sub run_test {
my ($pat_encode, $test_str) = @_;
say $test_str;
say '-' x length $test_str;
say "";
my @files = File::Find::Rule->new->name(qr/$pat_encode/)->in('.');
for (@files) {
$_ = Encode::decode('UTF-8', $_, Encode::FB_CROAK | Encode::LEAVE_SRC);
}
say $_ for @files;
}
出力は次のとおりです:ここでは一例である
With encode()
-------------
aæ
bæ
Without encode()
----------------
With encode()
-------------
aæ
bæ
私は最後の正規表現
[æ]$
が
æ
は2バイト
0xC3A6
に展開されるので、符号化された後に動作しますが、何とかしないことを期待する
Perlは、正規表現がUTF-8でエンコードされていることを知っているようで、動作するためにはいくつかの魔法を使っているようです。
後者の例が動作している、そして他の例がある場合は正規表現をコードする機能しない理由を誰かが知っているのだろうか? (File::Find::Rule
を使用できるかどうか、またはFile::Find
に切り替える必要があるかどうかを判断しようとしています)