【问题标题】:perl: split string at exact indexperl:在精确索引处拆分字符串
【发布时间】:2015-10-17 22:16:22
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您知道要拆分的索引,则不必纠结字符串的长度。 substr($foo, 0, $index), substr($foo, $index) 将为您提供第一个 $index 字符和其余字符。

标签: perl


【解决方案1】:

我建议使用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")

【讨论】:

    【解决方案2】:

    由于您似乎总是想要字符串的两个部分,并且由于您对字符位置的想法与 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}
    

    【讨论】:

      【解决方案3】:

      我不确定在索引 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';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-07
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        相关资源
        最近更新 更多