在Perl 6中更改字符串中的一个字母

时间:2017-10-31 22:13:47

标签: perl6

它应该非常简单,但如果没有list .comb,我就无法找到工具。 我有一个$string和一个(0 < $index < $string.chars - 1)。我需要制作$new_string,其编号为$index的元素将更改为“A”。

my $string = 'abcde';
my $index = 0; # $new_string should be 'Abcde'
my $index = 3; # $new_string should be 'abcAe'

2 个答案:

答案 0 :(得分:2)

这是我建议使用的:

my $string = 'abcde';
my $index = 0;

( my $new-string = $string ).substr-rw( $index, 1 ) = 'A';

say $string;     # abcde
say $new-string; # Abcde

如果你想远离变异操作:

sub string-index-replace (
  Str $in-str,
  UInt $index,
  Str $new where .chars == 1
){

  ( # the part of the string before the value to insert
    $in-str.substr( 0, $index ) xx? $index
  )
  ~
  ( # add spaces if the insert is beyond the end of the string
    ' ' x $index - $in-str.chars
  )
  ~
  $new
  ~
  ( # the part of the string after the insert
    $in-str.substr( $index + 1 ) xx? ( $index < $in-str.chars)
  )
}

say string-index-replace( 'abcde', $_, 'A' ) for ^10
Abcde
aAcde
abAde
abcAe
abcdA
abcdeA
abcde A
abcde  A
abcde   A
abcde    A

答案 1 :(得分:1)

要更改字符串中的单个字母,您可以在subst类型上使用Str方法:

my $string = 'abcde';
my $index = 0;
my $new_string = $string.subst: /./, 'A', :nth($index+1); # 'Abcde'
$index = 3;
$new_string = $string.subst: /./, 'A', :nth($index+1);    # 'abcAe'

:nth的“索引”从1开始。:nth的真正含义是“单独替换第n个匹配”。因为我们的正则表达式只匹配单个字符,:nth就像一个索引(尽管技术上不是)。