为什么要将Perl输入记录分隔符设置为$/="__数据;不工作?

为什么要将Perl输入记录分隔符设置为$/="__数据;不工作?,perl,Perl,为什么将Perl输入记录分隔符设置为$/=“\uu数据\uu\n”不起作用 数据记录设置如下: __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输入记录分隔符设置为$/=“\uu数据\uu\n”不起作用

数据记录设置如下:

 __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

为什么输入记录分隔符
$/=“\uuuu Data\uuuuu”不工作?它应该如何工作?

如果我正确理解了这个问题,您希望去掉
\uu数据部分。你想要这个

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;
    }
}
我还对代码做了一些一般性的改进<代码>$/
是全局的,将影响读取文件的所有内容<代码>本地
确保您的更改只发生在块内部

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

我已经打开了strict和warnings,它们会捕捉打字错误和一些小错误,比如
close()

input.txt

__Data__
1aaaaaaaaaa
aaaaaaaaaaa
aaaaaaaaaaaaa
__Data__
1bbbbbbbbbb
bbbbbbbbbbb
bbbbbbbbbbbbb
__Data__
1cccccccccc
ccccccccccc
ccccccccccccc
__Data__
使用
$/=qq{{\uuuuuuu数据\uuuuuuu\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__"
    ];

我想这是不言自明的。

这是数据中可见的文字“\n”吗?请不要发布您运行的代码以外的代码。不要发布您使用的数据以外的数据。发布您实际获得的输出。哪部分不是?它表示您使用了“
”$/=“Data\n”
。它表示获得了“
数据”
”作为输出。它表示您希望“
1aaaaaaaaaaa 1BBBBBBBBBBBB 1CCCCCCC
”作为输出,浮动“
}关闭()“等等。你读了吗?认真的?这是你今天第四次问这个问题了。你已经得到了足够多的帮助来自己解决这个问题。实际上,其他行工作的唯一原因是因为您的正则表达式与第一行不匹配,$/不会从数据中拆分并删除自身,它会拆分并将自身包含在数据中,这就是为什么您在循环中对$\执行任何操作之前先执行chomp。在if之前添加chomp就足够了,请阅读perldoc-f chomptanks,但问题是,如何打印每条记录的第一行?@YetimworkBeyene是的,现在好多了。我在文章的最后解释了这些变化,并对每一行进行了评论,解释了它的作用。如果您只是想在不理解现有代码的情况下将其粘贴到现有代码中,那么我不想给出这样的答案。如果您有关于更改的问题,我很乐意回答。这些答案的问题是,我必须将我的思维转换为新的代码答案,而不是从我的代码示例中得出的答案,这会使事情变得更加复杂。从您的示例中,我不知道为什么要使用$VAR1和$/=qq{{uuuuuu Data\uuuu\n}不起作用……首先,您必须牢牢掌握什么是
$/
,以及它如何影响文件读取
$VAR1..
Data::Dumper
输出,显示perl如何根据
$/
值逐个记录读取文件。
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__"
    ];
$VAR1 = [
      "__Data",
      "__\n1aaaaaaaaaa\naaaaaaaaaaa\naaaaaaaaaaaaa\n__Data",
      "__\n1bbbbbbbbbb\nbbbbbbbbbbb\nbbbbbbbbbbbbb\n__Data",
      "__\n1cccccccccc\nccccccccccc\nccccccccccccc\n__Data",
      "__"
    ];