Perl记录分隔符-

时间:2018-11-20 04:24:56

标签: perl parsing text-processing

我陷入了一个看似微不足道的问题,但是不确定我缺少什么。需要帮助。

我有一个文件,该文件由标准字段分隔符(0x1f)和记录分隔符(0x1e)字符分隔。 (https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text

我不需要解析字段,但是对获取记录感兴趣。

我了解了Perl的记录分隔符特殊变量,并尝试使用它来解析文件。

文件如下所示。 ^代表字段分隔符,^^代表记录分隔符(在vim中)。升华后,这些将显示为相关的十六进制代码。

ID^_NAME^_PARENTID^_Prov ID^_Pat_ID^_Another ID^_Program1^_Program2^_Status^_Date^_Reason^_Added^_Sn Length^_ze Reason^_StAge^_EnAge^_Notes^^NUMBER^_VARCHAR^_NUMBER^_    NUMBER^_NUMBER^_NUMBER^_VARCHAR^_VARCHAR^_VARCHAR^_DATE^_VARCHAR^_VARCHAR^_VARCHAR^_VARCHAR^_VARCHAR^_VARCHAR^_VARCHAR^^12^_40^_12^_^_12^_12^_200^_200^_12^_^_200^_1^_    4000^_4000^_2000^_2000^_4000^^0^_^_0^_^_0^_0^_^_^_^_^_^_^_^_^_^_^_^^

以下是我编写的用于解析记录的代码。问题是,无论我做什么,整个文件都被读入$ row标量。

我最初假设perl希望将$/设置为字符串类型。这样做似乎也行不通,我被困住了。

感谢任何帮助。谢谢。

#local $/ = sprintf("%s",chr("0xa"));
local $/ = chr(0xa);

open my $fh, "<", $file or die "$file: $!";

print("reading records\n");

while (my $row = <$fh>) {
    print("Record:", $row, "\n");
}

1 个答案:

答案 0 :(得分:3)

您可以使用chr(0xNN),但是将十六进制字符写为"\xNN"更简单。包含记录分隔符的字符串为"\x1e"

#!/usr/bin/env perl

use strict;
use warnings;
use v5.10;

my $file = shift;
open my $fh, "<", $file or die "$file: $!";

say "reading records";

local $/ = "\x1e";
while (my $row = <$fh>) {
    say("Record:", join ",", split /\x1f/, $row);
}