1

私は Strawberry Perl で遊んでみましたが、困惑したことの 1 つはファイルの読み取りでした。

私はやろうとしました:

open(FH, "D:\test\numbers.txt");

しかし、ファイルが見つかりません (ファイルが存在するにもかかわらず、アクセス許可の問題はありません)。

同等のコード (ファイル名以外のスクリプトは 100% 同一) は Linux で正常に動作しました。

4

2 に答える 2

12

Perl FAQ 5に従って、DOS/Windows ファイル名にスラッシュを使用する必要があります (または、代わりにバックスラッシュをエスケープします)。

DOS パスで「C:\temp\foo」を使用できないのはなぜですか? `C:\temp\foo.exe` が動作しないのはなぜですか?

おっと!そのファイル名にタブとフォームフィードを入れるだけです! 二重引用符で囲まれた文字列 ("like\this") 内では、バックスラッシュがエスケープ文字であることに注意してください。これらの完全なリストは Quote および Quote-like Operators in perlop にあります。当然のことながら、従来の DOS ファイルシステムには "c:(tab)emp(formfeed)oo" または "c:(tab)emp(formfeed)oo.exe" というファイルはありません。

文字列を一重引用符で囲むか、(できれば) スラッシュを使用してください。MS-DOS 2.0 など以降のすべての DOS および Windows バージョンではパス内の / と \ が同じように扱われているため、Perl と競合しないもの、または POSIX シェル、ANSI C およびC++、awk、Tcl、Java、または Python など。POSIX パスも移植性が高くなります。

したがって、open(FH, "D:/test/numbers.txt");「D:<TAB>est\numbers.txt」という名前のファイルを開こうとするのを避けるために、代わりにコードを使用する必要があります。


余談ですが、レキシカル (グローバルな名前の代わりに) ファイルハンドル、open の 3 引数形式、そして最も重要なこととして、すべての IO 操作、特にopen()呼び出しのエラー チェックを使用することで、コードをさらに改善できます。

open(my $fh, "<", "D:/test/numbers.txt") or die "Could not open file: $!";

または、いっそのこと、IO 呼び出しでファイル名をハードコードしないでください (次の方法で問題をより早く把握できる場合があります)。

my $filename = "D:/test/numbers.txt";
open(my $fh, "<", $filename) or die "Could not open file $filename: $!";
于 2012-02-13T18:21:02.887 に答える
1

補間が必要ない場合は、補間された文字列を使用しないでください。\t および \n! から、タブ文字と改行文字を含むファイル名を開こうとしています。

補間を必要としない (またはしたくない) 場合は、一重引用符を使用します。

初心者の Perl プログラマーが直面する最大の問題の 1 つは、何も考えずに自動的に "" を使用することです。"" と '' の違いを理解する必要があり、正しいものを選択できるように入力する前に常に考える必要があります。身につけるのは難しい習慣ですが、優れた Perl を作成する場合は不可欠です。

于 2012-02-14T11:01:30.963 に答える