在Perl中读取数据块

时间:2010-06-29 20:22:11

标签: perl

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

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

感谢。

3 个答案:

答案 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 packperldoc 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})/);