我在Perl中有一个长度为23位的字符串。我需要将它分成不同的部分。一个变量中的前两个数字,另一个变量中的下一个3,另一个变量中的下一个4等等。基本上23个数字最终需要作为6个单独的变量(2,3,4,4,3,7)字符,其中订购。
我有什么想法可以像这样剪掉字符串吗?
答案 0 :(得分:8)
有很多方法可以做到,但最短的可能是unpack:
my $string = '1' x 23;
my @values = unpack 'A2A3A4A4A3A7', $string;
如果您需要单独的变量,可以使用列表分配:
my ($v1, $v2, $v3, $v4, $v5, $v6) = unpack 'A2A3A4A4A3A7', $string;
答案 1 :(得分:2)
扩展Alex的方法,而不是指定每个开始和结束,使用您给出的长度列表。
#!/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
。我没有经验。
答案 2 :(得分:1)
你可以使用正则表达式,即:
$string =~ /\d{2}\d{3}\d{4}\d{4}\d{3}\d{7}/
用括号()围绕每个部分捕捉。
然后您在变量$ 1,$ 2中找到每个捕获... 或者将它们全部放在返回的列表中
答案 3 :(得分:0)
您想使用perldoc substr。
$substring = substr($string, $start, $length);
我还会在[开始,长度]对列表中使用“map”来让您的生活更轻松:
$string = "123456789";
@values = map {substr($string, $_->[0], $_->[1])} ([1, 3], [4, 2] , ...);
答案 4 :(得分:-1)
使用已经讨论过的unpack
。
sub string_slices {
my $str = shift;
return unpack( join( 'A', '', @_ ), $str );
}