【问题标题】:Shortest way to read a whole file in Perl with ony core modules [duplicate]使用仅核心模块在 Perl 中读取整个文件的最短方法 [重复]
【发布时间】:2015-09-14 21:24:30
【问题描述】:

使用我的 oneliners,我经常想在一个字符串中获取整个文件。只有核心模块,我知道考虑$file = 'foo' 的唯一解决方案是:

$str = do {local $/; open $fh, '<', $file; <$fh>};

或者

$str = qx{cat $file};

第二种方法写起来更短,更容易理解,但在幕后涉及更多的复杂性(sys_execve)。

有没有更好的方法或者我不知道的好糖?

【问题讨论】:

标签: perl


【解决方案1】:

另一种方法是:

my $file_content = do{local(@ARGV,$/)=$filename;<>};

很酷吧?这通过本地化 @ARGV 并将 $filename 保存为 @ARGV 的第一个元素。空菱形运算符 自动 打开@ARGV 的第一个元素的文件句柄,即 文件名。如果需要设置 PerlIO 层,文件句柄名称为 ARGV 所以你可以使用 binmode 来设置图层(在文件之前 阅读!):

http://perltricks.com/article/21/2013/4/21/Read-an-entire-file-into-a-string

Perl 6(仍然是 alpha 版本)有一个内置的函数来读取文件。也就是说,要阅读 将整个文件的内容转换为标量变量。

my $data = slurp $filename;

http://perl6maven.com/perl6-files

【讨论】:

  • 好技巧,我喜欢。不幸的是,对于新手来说它仍然非常神秘。 Perl 错过了 slurp 文件的原生方式 $str = slurp($file)
  • "Perl 6 有一个内置函数来读取文件。也就是说,将整个文件的内容读入一个标量变量。" perl6maven.com/perl6-files
  • Perl 6 仍处于 alpha 版本。 perl6.guide
  • 是的,从 2001 年开始......我担心 Perl 会在 Perl 6 的第一个版本之前死掉 :(
  • hastebin.com/irisonamog.pl 为您进行了现代化改造。
【解决方案2】:

CPAN 有一个很好的模块可以做到这一点:File::Slurp,一个简单高效的完整文件的读取/写入/修改

# read in a whole file into a scalar variable ($text)
my $text = read_file( $filename ) ;

【讨论】:

  • 确实不错,但不是核心模块的一部分。因此,它不是一个非常兼容的解决方案:(
  • 我不明白为什么人们如此反对 Perl 中的模块并且只想使用核心库。这些模块的存在是为了帮助人们并让人们不必编写自己的功能实现。你永远不会看到很多人用其他语言(如 java)说我只想使用核心 java 库而不使用其他 jars。
  • 很少安装一个新模块需要本地编译它,当你做“make”时它会失败。
  • 第二个如果你有一个脚本做一些简单的事情并且你必须分发它,你不喜欢有很多依赖。
  • File::Slurp 是一个纯 Perl 模块,所以在这种情况下不需要编译
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2012-11-27
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多