簡體   English   中英

如何在Perl中讀取多行?

[英]How can I read multiple lines in Perl?

我只想讀取文件中的多行。 例如在sample.txt中

"Hi, how are you?"
"Hello 

I'm
fine, thank you!"

現在我的問題是如何在不刪除句子中換行符的情況下閱讀第二條語句?

編輯:

看來我的問題不清楚。 因此,我認為我應該對此進行編輯:在上面的示例中,我需要獲取全部信息,

"Hello 

I'm
fine, thank you!"
while ($line = <PFILE>)
{
   #How can I get the statement to $line?
}

如果要一次讀取所有行,請更改行分隔符$/

{
    local $/;  # change the line separator to undef
    $filecontents = <FILE>;
}

如果您想一次閱讀兩行,則可以一次閱讀兩行。

$lines1_and_2 = <FILE>;
$lines1_and_2 .= <FILE>;

我不確定句子中“不刪除換行符”是什么意思,但是要逐行讀取文件,您會執行以下操作

open MYFILE, "<", "MyFile.txt"; # The < is for read mode
while ($line = <MYfILE>) {
    foo($line); #do whatever, one line at a time
}

如果您想一次將所有行讀入一個數組,則可以

my @lines = <MYFILE>;

或者要全部讀入一個字符串,請將換行符$ /更改為undefined

{
local $/; #initialized to undef
$file = <MYFILE>;
}

編輯:我想我終於明白了這個問題:

OP有一個文件,由於缺乏更好的術語,因此包含問題和答案。 問題總是在回應之前出現。 兩種類型的語句都用雙引號引起來。 問題及其關聯的響應之間有一個空白行(即"\\n\\n" )。 OP希望一對一(而不是逐行)閱讀問題及其相關的回答。

有幾種方法可以解決此問題(不必之以鼻)。 一種是假定雙引號沒有出現在感興趣的字符串的開頭或結尾之外的任何地方。 我不確定這會使以下腳本易碎的假設是否有效。 請注意,最后一個塊是無效的,因為答案沒有用雙引號引起來。

#!/usr/bin/perl

use strict;
use warnings;

while (
    defined(my $q = read_statement(\*DATA))
        and defined(my $a = read_statement(\*DATA))
) {
    print "QUESTION: $q\nANSWER: $a\n\n";
}

sub read_statement {
    my ($fh) = @_;

    my $line;
    while ( $line = <$fh> ) {
        last if $line =~ /^"/;
    }
    return unless defined $line;
    return $line if $line =~ /"$/;

    my $statement = $line;
    while ($line = <$fh> ) {
        $statement .= $line;
        last if $line =~ /"$/;
    }
    return unless $statement =~ /"$/;
    return $statement;
}

測試輸入:

__DATA__
"Hi how are you?"
"Hello

im
fine, thank you!"

"How is the weather?"

"It rained
all week.


It's been
gray

    and cold since the 15th"

"Who are you?"

Sinan

輸出:

C:\Temp> t
QUESTION: "Hi how are you?"

ANSWER: "Hello

im
fine, thank you!"


QUESTION: "How is the weather?"

ANSWER: "It rained
all week.


It's been
gray

    and cold since the 15th"

根據您的最新評論,我想知道這是否是您想要的:

#!/usr/bin/env perl
use strict;
use warnings;
use Text::Balanced qw/extract_delimited/;

my $filecontents = do { local $/; <> };

while (my $item = extract_delimited($filecontents, '"')) {
    print "Item: $item\n";
}

它會將每個選擇的雙引號(無論多長時間)捕獲為一項。 (可以預料:George這是一個解決方案,但是,不,我沒有選擇使用File::Slurp 。)

您要查找的操作稱為“文件讀取”,而不是未定義$ /

采用

File :: Slurp-有效讀取/寫入完整文件

這是該網站的摘要

  use File::Slurp;

  my $text = read_file( 'filename' ) ;
  my @lines = read_file( 'filename' ) ;

  write_file( 'filename', @lines ) ;

  use File::Slurp qw( slurp ) ;

  my $text = slurp( 'filename' ) ;

聽起來好像您想讀取文件中的所有“雙引號”值,包括跨行拆分的值。 如果是這樣,您可以執行以下操作:

my $content = join "", <>;
my @statements = ();
push @statements, $1 while $content =~ /"(.*?)"/msg;

這不能處理您引用的值中的轉義雙引號,但是您的示例沒有任何示例。 如果需要轉義引號,則需要稍微更改正則表達式或使用Text :: Balanced,如上所述。

隨着OP的澄清,他正在嘗試從文件中獲取帶引號的字符串,並假設每個字符串的結束引號都將在行的末尾,我的方法是:

#!/usr/bin/perl

use strict;
use warnings;

local $/ = qq("\n);    # Extra " to fix SO syntax highlighting

while (my $quot_text = <DATA>) {
  print "Next text:\n$quot_text\n"
}

__DATA__
"Hi how are you?"
"Hello 

im
fine, thank you!"

哪個返回:

Next text:
"Hi how are you?"

Next text:
"Hello

im
fine, thank you!"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM