perl:精确索引处的split string

时间:2015-10-17 22:16:23

标签: perl

我正在寻找一个perl函数,它可以将某个索引位置的字符串拆分为2个字符串的数组

例如:在索引1处拆分abcde将得到一个数组{ab} {cde}

我想我可以找出一个字符串的长度,然后得到substr $str, -$index的第一个偏移量和$substr $str,0 $length-$index的第二个偏移量。但是,我想知道是否存在执行此操作的perl函数。

3 个答案:

答案 0 :(得分:0)

我建议使用substr

#!/usr/bin/env perl

use strict;
use warnings;

my $string = 'abcde';

my $element1 = $string;
my $element0 = substr $element1, 0, 2, '';

use Data::Dump;

dd($element0, $element1);

但是,您可以使用正则表达式:

#!/usr/bin/env perl

use strict;
use warnings;

my $string = 'abcde';

my @array = $string =~ /(.{2})(.*)/s or die "failed to match, booo";

use Data::Dump;

dd @array;

或使用split

#!/usr/bin/env perl

use strict;
use warnings;

my $string = 'abcde';

my @array = split /(?<=.{2})/s, $string, 2;

use Data::Dump;

dd @array;

所有技术输出:

("ab", "cde")

答案 1 :(得分:0)

因为你似乎总是想要字符串的两个部分,并且由于你对字符位置的想法与Perl标准相差一点,所以最好将它包装在子程序中

以下是使用substrunpack的两种方法。前者可能更清晰,但如果您对速度感兴趣,后者可能会更快一点。但在这种情况下,您应该对它们进行基准测试并避免从堆栈中复制字符串

use strict;
use warnings;
use feature 'say';

say join ' ', map "{$_}", split_at('abcde', 1);
say join ' ', map "{$_}", split_at_2('abcde', 1);


sub split_at {
    my ($str, $n) = @_;
    ++$n;
    substr($str, 0, $n), substr($str, $n);
}

sub split_at_2 {
    my ($str, $n) = @_;
    ++$n;
    unpack "A$n A*", $str;
}

输出

{ab} {cde}
{ab} {cde}

答案 2 :(得分:0)

我不确定索引1处的分割'abcde'如何代替('ab','cde')而不是('a','bcde')。这是做某件事的事情:

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;
use v5.22;
use feature qw(signatures);
no warnings qw(experimental::signatures);

sub split_ind($str, $i) {
  my $x = $i + 1;
  return (substr($str, 0, $x), substr($str, $x));
}

my $in = "abcde";
say Dumper($in, split_ind($in, 1));

输出是:

$ ./string_split.pl
$VAR1 = 'abcde';
$VAR2 = 'ab';
$VAR3 = 'cde';