在Perl中读取数据块

itz*_*tzy 6 perl

当我没有可以使用的分隔符时,Perl将一条线分成不同长度的碎片是一种好方法.我的数据按列长度组织,因此第一个变量位于1-4位,第二个变量位于5-15位等.有许多变量各有不同的长度.

换句话说,有没有办法根据字符串中的位置使用split函数,而不是匹配的表达式?

谢谢.

Zai*_*aid 25

就在这里.该unpack函数非常适合处理固定宽度的记录.

my $record = "1234ABCDEFGHIJK";
my @fields = unpack 'A4A11', $record;  # 1st field is 4 chars long, 2nd is 11

print "@fields";                       # Prints '1234 ABCDEFGHIJK'
Run Code Online (Sandbox Code Playgroud)

第一个参数是模板,它告诉unpack字段开始和结束的位置.第二个参数告诉它要解压缩的字符串.

unpack也可以通过指定空字节来告诉它忽略字符串中的字符位置x.该模板'A4x2A9'可用于忽略"AB"上述示例中的内容.

请参阅perldoc -f packperldoc perlpacktut获取深入的详细信息和示例.

  • 我总是喜欢在模板字符串中包含空格,即解包('A4 A11 A1 A4 A6',$ record); 它对它的行为没有影响,但使它更容易阅读. (3认同)

Eth*_*her 6

而不是使用split,尝试老式substr方法:

my $first = substr($input, 0, 4);
my $second = substr($input, 5, 10);
# etc...
Run Code Online (Sandbox Code Playgroud)

(我也喜欢unpack方法,但是如果你只解析几个字段,那么在不查阅文档的情况下,substr更容易编写.)