为什么perl输入记录分隔符设置为$ / =“__ Data __ \ n”不起作用?

时间:2013-05-17 21:31:37

标签: perl

为什么设置为$/="__Data__\n"的perl输入记录分隔符不起作用?

数据记录设置如下:

 __Data__\n
 1aaaaaaaaaa\n
 aaaaaaaaaaa\n
 aaaaaaaaaaaaa\n
 __Data__\n
 1bbbbbbbbbb\n
 bbbbbbbbbbb\n
 bbbbbbbbbbbbb\n
 __Data__\n
 1cccccccccc\n
 ccccccccccc\n
 ccccccccccccc\n
 __Data__\n

以下是访问每个数据记录第一行的perl代码....

$/="__Data__\n";

open READFILE,"<","logA.txt" or die "Unable to open file";

while(<READFILE>)
{
   if(/([^\n]*)\n(.*)/sm)
   {
        print "$1\n";
   }
}
close(<READFILE>);

我得到了不受欢迎的输出:

__Data__

而不是理想的输出:

1aaaaaaaaaaa
1bbbbbbbbbbb
1ccccccccccc

有人可以告诉我为什么输入记录分隔符$/="__Data__";不起作用或者我对它应该如何工作的误解?

2 个答案:

答案 0 :(得分:4)

如果我正确理解了这个问题,您想要删除__Data__部分。你想要这个......

1aaaaaaaaaa
1bbbbbbbbbb
1cccccccccc

......但是你得到了这个......

__Data__
1aaaaaaaaaa
1bbbbbbbbbb
1cccccccccc

您可以使用chomp命令删除行尾。通常这只是换行符,但chomp会响应您设置$/的内容。

use strict;
use warnings;

{
    local $/="__Data__\n";
    open my $fh, "<", "logA.txt" or die "Unable to open file";

    while(my $record = <$fh>) {
        chomp $record;
        print $record;
    }
}

顺便说一句,因为你改变了&#34;行尾#34的概念,__Data__字段之间的所有内容都将被视为一行。如果您需要拆分行,可以使用my @lines = split "\n", $record

use strict;
use warnings;

{
    # Isolate the change to the global $/
    local $/="__Data__\n";

    open my $fh, "<", "logA.txt" or die "Unable to open file";

    while(my $record = <$fh>) {
        # Remove the __Data__ separator
        chomp $record;

        # Split the record by line
        my @lines = split /\n/, $record;

        # Empty record, skip it
        next if !@lines;

        # Print the first line of the record
        print $lines[0], "\n";
    }
}

我还对您的代码进行了一些改进。 $/是全局的,会影响读取文件的所有内容。 local确保您的更改仅在块内发生。

我使用了词法文件句柄,当它们超出范围时(当它们被声明的块完成时),它们会自动关闭。

我已经开启了严格的警告,这些警告可能会发现错别字和close(<READLINE>)等错误。

答案 1 :(得分:2)

input.txt中

__Data__
1aaaaaaaaaa
aaaaaaaaaaa
aaaaaaaaaaaaa
__Data__
1bbbbbbbbbb
bbbbbbbbbbb
bbbbbbbbbbbbb
__Data__
1cccccccccc
ccccccccccc
ccccccccccccc
__Data__

使用$/=qq{__Data__\n}

perl -e 'use Data::Dumper;$Data::Dumper::Useqq=1; $/=qq{__Data__\n}; open $fh,"input.txt"; print Dumper [ <$fh> ]'

$VAR1 = [
      "__Data__\n",
      "1aaaaaaaaaa\naaaaaaaaaaa\naaaaaaaaaaaaa\n__Data__\n",
      "1bbbbbbbbbb\nbbbbbbbbbbb\nbbbbbbbbbbbbb\n__Data__\n",
      "1cccccccccc\nccccccccccc\nccccccccccccc\n__Data__"
    ];

使用$/=qq{Data}

$VAR1 = [
      "__Data",
      "__\n1aaaaaaaaaa\naaaaaaaaaaa\naaaaaaaaaaaaa\n__Data",
      "__\n1bbbbbbbbbb\nbbbbbbbbbbb\nbbbbbbbbbbbbb\n__Data",
      "__\n1cccccccccc\nccccccccccc\nccccccccccccc\n__Data",
      "__"
    ];

我想这是自我解释的。