关于opendir和readdir的Perl程序帮助

时间:2010-11-26 00:00:49

标签: perl readdir opendir

所以我有一个程序,我想清理一些文本文件。该程序要求用户输入包含这些文本文件的目录的完整路径。从那里我想读取目录中的文件,将它们打印到一个新文件(由用户指定),然后以我需要的方式清理它们。我已经编写了脚本来清理文本文件。

我要求用户输入目录:

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

然后我需要阅读目录。

my @dir = readdir DIR;

foreach (@dir) {

现在我迷路了。

请帮忙吗?

4 个答案:

答案 0 :(得分: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 $_;
}

答案 1 :(得分:1)

我建议您切换到File :: Find。它在一开始可能是一个挑战,但它是强大的跨平台。

但是,要回答你的问题,请尝试以下方法:

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

其中“foo”是您需要对文件执行的操作。一些注释可能有所帮助:

  • 使用“@dir”作为文件数组有点误导
  • 需要在文件名前添加文件夹名称以获取正确的文件
  • 使用grep删除不需要的文件和子文件夹可能会很方便,特别是“..”

答案 2 :(得分: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读取的文件名只是基本名称;它们不是完整的路径名。

答案 3 :(得分:0)

您可以执行以下操作,以允许用户提供自己的目录,或者,如果用户未指定目录,则默认为指定位置。

该示例显示了opendirreaddir的用法,将所有文件存储在@files数组的目录中,而在{{中仅以'.txt'结尾的文件1}}数组。 while循环可确保将文件的完整路径存储在数组中。

这假定您的“文本文件”以“ .txt”后缀结尾。我希望能有所帮助,因为我不太确定“清理文件”的含义。

@keys

有关更多信息,请参见perldoc of File::Copy