在一个语句中将文件读入字符串?

时间:2016-05-19 03:31:43

标签: string perl file

我有以下代码但可以在一个声明中完成吗?

heroku run rake db:migrate

heroku run rake db:seed

3 个答案:

答案 0 :(得分:4)

open FILE, $file; while (<FILE>) { $filestr .= $_; }

但是,换行符的存在是令我担心该片段的最后一件事。我会更担心以下事项:

  • 使用两个arg open
  • 缺少对open
  • 的错误检查
  • 使用全局变量
  • 缺少use strict;
  • 的使用
  • 可怜的变量名。

open(my $fh, '<', $qfn)
   or die("Can't open \"$qfn\": $!\n");

my $file; { local $/; $file = <$fh>; }

答案 1 :(得分:0)

:看起来你想要啜饮一个文件,你想让我取消输入记录分隔符吗?

$ perldoc perlvar # /slurp<enter><copy example code><paste>
$ perl -E '
my $file = "test.txt";
my $content = "";
open my $fh, "<", $file or die $!;
{
  local $/;
  $content = <$fh>;
}
close $fh;
print $content;'

它永远不会成为一个声明。但任何东西都可以是一行代码&#34; in perl。
那么......我们做得对吗?你的意思是没有循环没有你。

需要考虑的其他事项:

open my FILE, '<', $file or die $!;
my @filestrs = <FILE>;

cpanm File::Map之后:

use File::Map qw(map_file);
map_file my $filestr, $file;

Path::Tiny类似:

use Path::Tiny;
my $filestr = path($file)->slurp; # or ->slurp_utf8;

排成一行:

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

更少的陈述仍然是:

open(my $fh, '<', $file);
read($fh, $filestr, -s $fh);

答案 2 :(得分:0)

我会将你的问题解释为:

  

如何将两个语句写成单个语句而不用   使用其他模块或子程序。

Perl并不会阻止你在脚下射击自己,所以如果你认为分号是声明分隔符,可以将以下内容视为一个声明:

open (FILE, $file) and do {$filestr .= $_ while (<FILE>)};

尽管在do块的末尾有一个隐式分号,但这种结构永远不应该在实际代码中使用,因为它会阻止以通常的方式检查open错误:

open (FILE, $file) or die "Could not open file '$file': $!";