2

だから私はいくつかのテキストファイルをきれいにしたいプログラムを持っています。プログラムは、これらのテキスト ファイルを含むディレクトリの完全なパスを入力するようにユーザーに要求します。そこから、ディレクトリ内のファイルを読み取り、それらを新しいファイル (ユーザーが指定したもの) に出力し、必要な方法でそれらを消去します。テキスト ファイルを消去するスクリプトは既に作成しています。

使用するディレクトリをユーザーに尋ねます。

chomp ($user_supplied_directory = <STDIN>); 
opendir (DIR, $user_supplied_directory);

次に、ディレクトリを読み取る必要があります。

my @dir = readdir DIR;

foreach (@dir) {

今、私は迷っています。

何か助けてください。

4

4 に答える 4

2

私はあなたが何を望んでいるのか確信が持てません。だから、私はいくつかの仮定をしました:

  • テキスト ファイルをきれいにするというのは、テキスト ファイルを削除するという意味です。
  • 書き込みたいファイルの名前は、パターンによって形成されます。

したがって、私が正しければ、次のようなことを試してください。

chomp ($user_supplied_directory = <STDIN>);

opendir (DIR, $user_supplied_directory);
my @dir = readdir DIR;

foreach (@dir) {
    next if (($_ eq '.') || ($_ eq '..'));

    # Reads the content of the original file
    open FILE, $_;
    $contents = <FILE>;
    close FILE;

    # Here you supply the new filename
    $new_filename = $_ . ".new";

    # Writes the content to the new file
    open FILE, '>'.$new_filename;
    print FILE $content;
    close FILE;

    # Deletes the old file
    unlink $_;
}
于 2010-11-26T00:33:15.003 に答える
2

File::Find に切り替えることをお勧めします。最初は少し難しいかもしれませんが、強力でクロスプラットフォームです。

しかし、あなたの質問に答えるには、次のようなことを試してください。

my @files = readdir DIR;
foreach $file (@files) {
   foo($user_supplied_directory/$file);
}

ここで、「foo」は、ファイルに対して行う必要があるものです。いくつかのメモが役立つ場合があります。

  • ファイルの配列として「@dir」を使用すると、少し誤解を招く可能性があります
  • 適切なファイルを取得するには、フォルダ名をファイル名の前に追加する必要があります
  • grep不要なファイルやサブフォルダー、特に「..」を捨てるのに便利かもしれません。
于 2010-11-26T00:34:06.650 に答える
1

今日は を使ったものを書きましたreaddir。そこから何かを学べるかもしれません。これは (やや) 大きなプログラムの一部に過ぎません:

our @Perls = ();

{
    my $perl_rx = qr { ^ perl [\d.] + $ }x;
    for my $dir (split(/:/, $ENV{PATH})) {
        ### scanning: $dir
        my $relative = ($dir =~ m{^/});
        my $dirpath = $relative ? $dir : "$cwd/$dir";
        unless (chdir($dirpath)) {
            warn "can't cd to $dirpath: $!\n";
            next;
        }
        opendir(my $dot, ".") || next;
        while ($_ = readdir($dot)) {
            next unless /$perl_rx/o;
            ### considering: $_
            next unless -f;
            next unless -x _;
            ### saving: $_
            push @Perls, "$dir/$_";
        }
    }
}

{
    my $two_dots = qr{ [.] .* [.] }x;
    if (grep /$two_dots/, @Perls) {
        @Perls = grep /$two_dots/, @Perls;
    }
}

{
    my (%seen, $dev, $ino);
    @Perls = grep {
        ($dev, $ino) = stat $_;
        ! $seen{$dev, $ino}++;
    } @Perls;
}

核心はpush(@Perls, "$dir/$_")次のとおりです。読み取られるファイル名readdirはベース名のみです。それらは完全なパス名ではありません。

于 2010-11-26T00:46:04.923 に答える
0

次のことができます。これにより、ユーザーは独自のディレクトリを指定できます。ユーザーがディレクトリを指定しない場合は、デフォルトで指定された場所になります。

この例は、 , の使用を示しておりopendirreaddirディレクトリ内のすべてのファイルを@files配列に格納し、'.txt' で終わるファイルのみを配列に格納し@keysます。while ループにより、ファイルへのフル パスが配列に格納されます。

これは、「テキスト ファイル」が「.txt」サフィックスで終わることを前提としています。「ファイルのクリーニング」が何を意味するのかよくわからないので、それが役立つことを願っています。

use feature ':5.24';
use File::Copy;

my $dir = shift || "/some/default/directory";

opendir(my $dh, $dir) || die "Can't open $dir: $!";

while ( readdir $dh ) {
    push( @files, "$dir/$_");
}

# store ".txt" files in new array
foreach $file ( @files ) {
    push( @keys, $file ) if $file =~ /(\S+\.txt\z)/g;
}

# Move files to new location, even if it's across different devices
for ( @keys ) {
    move $_, "/some/other/directory/"; || die "Couldn't move files: $!\n";
}

詳細については、File::Copy の perldoc を参照してください。

于 2019-01-01T07:27:18.293 に答える