请注意 – 我不是在寻找“正确”的方式来打开/读取文件,或者我应该打开/读取文件的方式每一次。我只是想知道大多数人使用的方式,或许可以同时学习一些新的方法:)*
在我的Perl程序中一个非常常见的代码块是打开一个文件并读取或写入它。我已经看到了这么多的方式这样做,我执行这项任务的风格已经改变了几年了。我只是想知道什么最好的(如果有一个最好的方法)方法是这样做?
我曾经打开过这样的文件:
my $input_file = "/path/to/my/file"; open INPUT_FILE,"<$input_file" || die "Can't open $input_file: $!\n";
但我认为有错误陷阱的问题。
open (INPUT_FILE,"<$input_file") || die "Can't open $input_file: $!\n";
我知道你也可以分配一个文件句柄到一个变量,因此,而不是像我上面的使用“INPUT_FILE”,我可以使用$ input_filehandle – 是更好的方式?
对于读取文件,如果它很小,globbing有什么问题,像这样?
my @array = <INPUT_FILE>;
要么
my $file_contents = join( "\n",<INPUT_FILE> );
或者你应该总是循环,像这样:
my @array; while (<INPUT_FILE>) { push(@array,$_); }
解决方法
没有普遍的标准,但有理由更喜欢彼此。我的首选形式是:
open( my $input_fh,"<",$input_file ) || die "Can't open $input_file: $!";
原因是:
>您立即报告错误。 (如果你想要的,用“warn”替换“die”。)
>你的文件句柄现在被引用计数,所以一旦你不使用它,它会自动关闭。如果使用全局名称INPUT_FILEHANDLE,则必须手动关闭文件,否则它将保持打开,直到程序退出。
>读取模式指示符“<”与$ input_file分开,增加了可读性。
以下是伟大的,如果文件是小,你知道你想要所有的行:
my @lines = <$input_fh>;
你甚至可以这样做,如果你需要处理所有行作为一个单一的字符串:
my $text = join('',<$input_fh>);
对于长文件,您将要使用while迭代线,或使用读。