【问题标题】:open multiline text file in perl在 perl 中打开多行文本文件
【发布时间】:2018-01-16 10:30:49
【问题描述】:

我有以下文本文件

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。如何让它打印我所有的输入文本行,而不仅仅是第一行?

【问题讨论】:

  • while (&lt;$fh&gt;){ print; }

标签: perl variables multiline


【解决方案1】:

如果您阅读perldoc perlop 中的section on I/O operators,您将看到以下内容:

在标量上下文中,计算尖括号中的文件句柄会产生该文件的下一行

而且,再往下一点:

如果在查找列表的上下文中使用&lt;FILEHANDLE&gt;,则返回一个包含所有输入行的列表,每个列表元素一行。

如果您将&lt;FILEHANDLE&gt; 分配给标量变量,您将从文件中获取下一行(实际上是记录)。这就是你正在做的事情:

my $text = <$fh>;

如果您将&lt;FILEHANDLE&gt; 分配给一个数组,您将从文件中获取所有剩余数据,其中每一行(实际上是记录)在数组的一个单独元素中。

my @text = <$fh>;

如果您想将文件中的所有数据转换为标量,您可以采用几种方法。天真的方法是读取列表上下文中的数据,然后使用空字符串将其连接起来:

my $text = join '', <$fh>;

您可以使用$/ 来改变Perl 对“记录”的看法(通常在do 块中完成):

my $text = do { local $/; <$fh> };

我喜欢the slurp method from Path::Tiny

use Path::Tiny;

my $text = path($filename)->slurp;

【讨论】:

    【解决方案2】:

    在标量上下文中,计算尖括号中的文件句柄会产生该文件的下一行

    所以你可以使用while循环来读取行(首选方法)

    while (<$fh>) #output will store into default variable $_
    {
        print ; 
    
    }
    

    或者您可以使用数组,但您试图将文件的所有内容一次存储在变量中

    my @array = <$fh>;
    

    和slurp模式读取标量变量中的所有文件

    my $multiline = do { local $/; <$fh>; } #$/ input record seprator
    

    【讨论】:

    • “当您将文件句柄存储到标量变量中时,它将从文件中读取下一行” 当您将文件句柄存储在多变的。当您在文件句柄上调用 readline 时,可能。
    • 当您将文件句柄存储到标量变量中时,它将从文件中读取下一行 或者更准确地说,正如 perldoc 所说:“在标量上下文中,评估尖括号中的文件句柄产生该文件的下一行"。
    • @DaveCross 和 Borodin 感谢您的评论帖子已编辑
    猜你喜欢
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2015-01-02
    • 2016-09-11
    • 1970-01-01
    • 2011-05-27
    相关资源
    最近更新 更多