当我没有可以使用的分隔符时,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 pack
并perldoc perlpacktut
获取深入的详细信息和示例.
而不是使用split
,尝试老式substr方法:
my $first = substr($input, 0, 4);
my $second = substr($input, 5, 10);
# etc...
Run Code Online (Sandbox Code Playgroud)
(我也喜欢unpack方法,但是如果你只解析几个字段,那么在不查阅文档的情况下,substr更容易编写.)