perl:在精确索引处拆分字符串

perl:在精确索引处拆分字符串,perl,Perl,我正在寻找一个perl函数,它可以将某个索引位置的字符串拆分为2个字符串的数组 例如:在索引1处拆分abcde将得到一个数组{ab}{cde} 我想我可以找出字符串的长度,然后在substr$str,-$index处得到第一个偏移量,第二个偏移量是$substr$str,0$length-$index。但是,我想知道是否有一个现有的perl函数可以实现这一点 我建议使用substr 但是,您可以使用正则表达式: #!/usr/bin/env perl use strict; use warni

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

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

我想我可以找出字符串的长度,然后在substr$str,-$index处得到第一个偏移量,第二个偏移量是$substr$str,0$length-$index。但是,我想知道是否有一个现有的perl函数可以实现这一点

我建议使用substr

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

#!/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;
或使用拆分:


由于您似乎总是需要字符串的两个部分,而且您对字符位置的想法与Perl标准不同,因此最好将其封装在一个子例程中

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

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;
}
输出 我不确定指数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';

如果您知道要拆分的索引,就不必搞乱字符串的长度。substr$foo,0,$index,substr$foo,$index将获得第一个$index字符和剩余的字符。
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}
#!/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';