3

.html を読み取る Perl プログラムがあり、プログラムが .html と同じディレクトリにある場合にのみ機能します。
別のディレクトリで開始し、html の場所をパラメーターとして渡すことができるようにしたいと考えています。プログラム (以下のシェルの例) は、サブディレクトリ "sub" とそのサブディレクトリを走査して .html を探しますが、perl ファイルが同じサブディレクトリ "sub" にある場合にのみ機能します。サブディレクトリ「sub」から一歩下がったホームディレクトリにPerlファイルを置いても動かない。

シェルで、ホーム ディレクトリから「perl project.pl ./sub」と入力すると、./sub/file1.html を開けませんでしたと表示されます。そのようなファイル、又はディレクトリはありません。それでも、ファイルはその正確な場所に存在します。file1.html は、読み取ろうとしている最初のファイルです。

シェル内のディレクトリをそのサブディレクトリに変更し、そこに .pl ファイルを移動してから、シェルで「perl project.pl ./」と言うと、すべて問題ありません。

ディレクトリを検索するために、私はここで見つけた File::Find コンセプトを使用しています: ディレクトリ内のすべてのファイルをトラバースする方法。サブディレクトリがある場合は、サブディレクトリ内のファイルもトラバースしたい Find::File ファイルのリストのディレクトリを検索する

#!/usr/bin/perl -w
use strict;
use warnings;
use File::Find;

find( \&directories, $ARGV[0]);

sub directories {
    $_ = $File::Find::name;

    if(/.*\.html$/){#only read file on local drive if it is an .html
        my $file = $_;
        open my $info, $file or die "Could not open $file: $!";
        while(my $line = <$info>)  {   

        #perform operations on file
        }
        close $info;
    }
    return;
}
4

3 に答える 3

3

File::Findのドキュメントには、次のように書かれています。

no_chdir が指定されていない限り、関数が呼び出されると $File::Find::dir に chdir() されます。ディレクトリへの変更が有効な場合、$File::Find::dir、'/' および $_ の連結が文字どおり $File::Find と等しくないため、ルート ディレクトリ (/) は多少特殊なケースであることに注意してください。 ::名前。

だから、あなたは実際には~/subすでにです。ファイル名のみを使用して$_ください。上書きする必要はありません。次の行を削除します。

$_ = $File::Find::name; 
于 2013-05-13T17:17:51.833 に答える
1

findディレクトリが自動的に変更されるため$File::Find::name、現在のディレクトリとの相対関係はなくなります。

この行を削除して機能させることができます。

$_ = $File::Find::name;

File::Find も参照してくださいno_chdir

于 2013-05-13T17:17:43.133 に答える
1

File::Findドキュメントから:

見つかったファイルまたはディレクトリごとに、&wanted サブルーチンを呼び出します。( &wanted 関数の使用方法の詳細については、以下を参照してください)。さらに、見つかったディレクトリごとに、そのディレクトリに chdir() して検索を続行し、ディレクトリ内の各ファイルまたはサブディレクトリに対して &wanted 関数を呼び出します。

(私のものを強調)

が見つからない理由./sub/file1.htmlは、openが呼び出されたときに File::Find がすでにchdirあなたを に編集しているためです./sub/。としてファイルを開くことができるはずですfile1.html

于 2013-05-13T17:17:55.833 に答える