【发布时间】:2011-02-22 20:17:56
【问题描述】:
我在 Perl 中有一个 23 位长的字符串。我需要把它分成不同的部分。一个变量中的前 2 个数字,另一个变量中的下 3 个数字,另一个变量中的下 4 个数字,等等。基本上,这 23 个数字需要以 6 个单独的变量(2、3、4、4、3、7)字符结束,因为命令。
有什么办法可以像这样剪断绳子吗?
【问题讨论】:
标签: perl
我在 Perl 中有一个 23 位长的字符串。我需要把它分成不同的部分。一个变量中的前 2 个数字,另一个变量中的下 3 个数字,另一个变量中的下 4 个数字,等等。基本上,这 23 个数字需要以 6 个单独的变量(2、3、4、4、3、7)字符结束,因为命令。
有什么办法可以像这样剪断绳子吗?
【问题讨论】:
标签: perl
有很多方法可以做到,但最短的可能是unpack:
my $string = '1' x 23;
my @values = unpack 'A2A3A4A4A3A7', $string;
如果需要单独的变量,可以使用列表赋值:
my ($v1, $v2, $v3, $v4, $v5, $v6) = unpack 'A2A3A4A4A3A7', $string;
【讨论】:
扩展亚历克斯的方法,而不是指定每个开始和结束,使用您提供的长度列表。
#!/usr/bin/env perl
use strict;
use warnings;
my $string = "abcdefghijklmnopqrstuvw";
my $pos = 0;
my @split = map {
my $start = $pos;
my $end = $_;
$pos += $end;
substr( $string, $start, $end);
} (2,3,4,4,3,7);
print "$_\n" for @split;
这表示您可能应该查看用于固定宽度字段的unpack。不过我没有这方面的经验。
【讨论】:
您可以使用正则表达式,即:
$string =~ /\d{2}\d{3}\d{4}\d{4}\d{3}\d{7}/
并用括号 () 括起来捕获每个部分。
然后您可以在变量 $1、$2 ... 中找到每个捕获 或将它们全部放入返回的列表中
【讨论】:
你想使用perldoc substr。
$substring = substr($string, $start, $length);
我还会在 [start, length] 对的列表中使用 `map' 来让您的生活更轻松:
$string = "123456789";
@values = map {substr($string, $_->[0], $_->[1])} ([1, 3], [4, 2] , ...);
【讨论】:
这里有一个 sub 可以使用已经讨论过的unpack。
sub string_slices {
my $str = shift;
return unpack( join( 'A', '', @_ ), $str );
}
【讨论】: