Perl:我如何从子目录中读取文件?

时间:2013-09-08 22:17:50

标签: perl

我是Perl的新手,所以如果我错过了一个明显的答案,请原谅。我将非常感谢你的帮助。

我正在尝试读取位于子目录中的文件,因此我可以提取一些信息,并将信息打印到新文件中。

我知道如何读取当前目录中的文件(并打印到新文件中):

open IN, "$file_name" or die "No such file: !$";
open OUT, ">$new_file_name" or die " No such file: !$";

while (<IN>) {
print OUT $_;
}

但是如何对位于子目录中的文件执行此操作?

非常感谢,

尼卡

编辑:

非常感谢你们!我已经解决了这个问题!

5 个答案:

答案 0 :(得分:3)

open采用路径,所以

my $file_name = 'subdir/file.ext';

这是您的代码,有许多改进:

open my $IN, '<', $in_qfn
    or die "Can't open \"$in_qfn\": $!\n";

open my $OUT, '>', $out_qfn
    or die "Can't create \"$out_qfn\": $!\n";

while (<$IN>) {
    print $OUT $_;
}

如果可能的话,我实际上会使用ARGV和STDOUT来获得最大的灵活性。

while (<>) {
    print;
}

答案 1 :(得分:3)

有两种显而易见的方法:

  1. 按文件的完整路径名访问该文件,即$file_name的值必须类似于directoryname/filename.txt,或者您在第一行代码中编写"directoryname/$filename"

  2. 更改工作目录。也就是说,在访问文件之前使用Perl chdir函数更改工作目录:chdir "directoryname";请记住,这会影响所有后续文件系统操作。如果您想返回,请使用chdir "..";

  3. 在任何一种情况下,熟悉工作目录,特殊目录名称(...),路径分隔符/,相对和绝对的概念是非常有帮助的。路径以及文件系统的工作方式。

答案 2 :(得分:1)

只需给它一个完整的目录路径。如果您位于文件所在的目录中,则可以使用pwd命令获取完整路径。请注意,您应始终使用文件的限定/完整路径,因为您永远不知道可以从哪里调用脚本。 (这只是很好的编程习惯)

use strict;
use warnings;

my $filename = 'your_full/path/sub_dir/data.txt';
if (open(my $fh, '<:encoding(UTF-8)', $filename)) {
while (my $row = <$fh>) {
chomp $row;
print "$row\n";
}
} else {
warn "Could not open file '$filename' $!";
}

答案 3 :(得分:0)

您的变量(或字符串)可能包含文件的相对路径,因此只需说明

open IN, "foo/$file1"

哦和use 3-argument open

答案 4 :(得分:0)

您只需在子目录中指定文件的名称即可。使用正斜杠将目录与子目录分开。

这是你的程序以更现代的方式编写:

use strict;
use warnings;
use autodie;
use feature qw(say);

my $file_name = "path/to/file";
my $new_file_name = "path/to/new/file";

open my $in_fh, "<" $file_name;
open my $out_fh, ">", $new_file_name;

while my $line ( <$in_fh> ) {
    print {$out_fh} $line;
}
close $in_fh;
close $out_fh;
  • use strict;要求您声明可以为您节省大量麻烦的变量。例如,您在另一个位置$foo$Foo(大写 F )。使用use strict;,Perl会为您捕获这些错误。您使用myour声明变量。 99%的情况下,您将使用my
  • use warnings;会打开各种警告。例如,您正在尝试使用未定义的变量执行某些操作。
  • 在很多情况下,
  • use autodie会自动终止你的Perl脚本。例如,您无法打开或关闭文件。或者,如果磁盘已满,并且您的print语句无法打印到文件,该怎么办?
  • use feature qw(say);允许您使用say代替printsay命令会自动为你的行尾添加一个NL,这比听起来要方便得多。
  • 使用三个参数 openclose,并为文件句柄使用变量名称。这使得传递文件句柄更容易用于子例程。
  • 不必使用默认$_。使用它有很多问题(我现在不打算进入。它确实不会增加程序的清晰度,并且会多次让你陷入困境。
  • 完成文件后使用close

你应该在Modern Perl上找到一本好书。例如,在你的程序中,我本可以这样做:

use strict;
use warnings;
use autodie;
use feature qw(say);

use File::Copy;    # Adds a `copy` command to Perl

use constant {     # Adds the concept of a constant to Perl
    IN_FILE   =>  'path/to/file',
    OUT_FILE  =>  '/paht/to/new/file',
};

copy IN_FILE, OUT_FILE;   # That's it!

无需打开文件。无需使用循环。 copy命令将为您完成。

这些模块(如File::Copy在Perl的标准安装中可用。您需要了解它们,以便使用它们。这就是为什么你应该得到一本好书并完成它。

与Perl玩得开心,请学习正确的做事方式。它使Perl成为一种更容易使用和学习的语言。