当我没有可以使用的分隔符时,Perl将一条线分成不同长度的片段是一种好方法。我的数据按列长度排列,因此第一个变量位于1-4位,第二个变量位于5-15位等。有许多变量各有不同的长度。
换句话说,有没有办法根据字符串中的位置使用split函数,而不是匹配的表达式?
感谢。
答案 0 :(得分:25)
是的。 unpack
函数非常适合处理固定宽度的记录。
my $record = "1234ABCDEFGHIJK";
my @fields = unpack 'A4A11', $record; # 1st field is 4 chars long, 2nd is 11
print "@fields"; # Prints '1234 ABCDEFGHIJK'
第一个参数是模板,它告诉unpack
字段的开始和结束位置。第二个参数告诉它解压缩哪个字符串。
unpack
来告诉 x
忽略字符串中的字符位置。模板'A4x2A9'
可用于忽略上述示例中的"AB"
。
有关详细信息和示例,请参阅perldoc -f pack
和perldoc perlpacktut
。
答案 1 :(得分:6)
不要使用split
,而是尝试使用旧式substr方法:
my $first = substr($input, 0, 4);
my $second = substr($input, 5, 10);
# etc...
(我也喜欢unpack方法,但如果你只解析几个字段,那么在不查阅文档的情况下,substr更容易编写。)
答案 2 :(得分:4)
您可以使用substr()
函数按偏移量提取数据:
$first = substr($line, 0, 4);
$second = substr($line, 4, 11);
另一种选择是使用正则表达式:
($first, $second) = ($line =~ /(.{4})(.{11})/);