在perl中打开多行文本文件

时间:2018-01-16 10:30:49

标签: perl variables multiline

我有以下文本文件

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。如何使其打印所有输入文本行而不仅仅是第一行?

2 个答案:

答案 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