在Perl中切割字符串

时间:2011-02-22 20:17:57

标签: perl

我在Perl中有一个长度为23位的字符串。我需要将它分成不同的部分。一个变量中的前两个数字,另一个变量中的下一个3,另一个变量中的下一个4等等。基本上23个数字最终需要作为6个单独的变量(2,3,4,4,3,7)字符,其中订购。

我有什么想法可以像这样剪掉字符串吗?

5 个答案:

答案 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中找到每个捕获... 或者将它们全部放在返回的列表中

请参阅perldoc perlre

答案 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 );
}
相关问题