我有以下文本文件
Hello my
name is
Jeff
我想用perl打开它。但是,使用此代码时
use strict;
use warnings;
open(my $fh, "<", "input.txt") or die "cannot open input text!";
my $text= <$fh>;
print $text;
输出文本仅为Hello my
。如何使其打印所有输入文本行而不仅仅是第一行?
答案 0 :(得分:2)
如果您阅读了section on I/O operators中的perldoc perlop,您会看到以下内容:
在标量上下文中,评估尖括号中的文件句柄会产生该文件的下一行
而且,更进一步:
如果在查找列表的上下文中使用
<script src="https://d3js.org/d3.v4.min.js"></script>
,则返回包含所有输入行的列表,每个列表元素一行。
如果将<FILEHANDLE>
指定给标量变量,您将从文件中获取下一行(实际记录)。这就是你在做的事情:
<FILEHANDLE>
如果将my $text = <$fh>;
分配给数组,您将从文件中获取所有剩余数据,每行(实际记录)位于数组的单独元素中。
<FILEHANDLE>
如果要将文件中的所有数据都转换为标量,可以采用一些方法。天真的方法是读取列表上下文中的数据,然后使用空字符串连接它:
my @text = <$fh>;
您可以使用my $text = join '', <$fh>;
更改Perl对“记录”的想法(通常在$/
块中完成):
do
我喜欢the slurp
method from Path::Tiny。
my $text = do { local $/; <$fh> };
答案 1 :(得分:0)
在标量上下文中,评估尖括号中的文件句柄会产生该文件的下一行
所以你可以使用while循环读取行(首选方法)
while (<$fh>) #output will store into default variable $_
{
print ;
}
或者你可以使用数组,但是你试图在变量中存储文件的所有内容
my @array = <$fh>;
以slurp模式读取标量变量中的所有文件
my $multiline = do { local $/; <$fh>; } #$/ input record seprator