It should be very simple, but I can't find an instrument to do it without making a list with .comb.
I have a $string and an  (0 < $index < $string.chars - 1). I need to make a $new_string, whose element with number $index will be changed, say, to 'A'.
my $string = 'abcde';
my $index = 0; # $new_string should be 'Abcde'
my $index = 3; # $new_string should be 'abcAe'
                This is what I would recommend using:
my $string = 'abcde';
my $index = 0;
( my $new-string = $string ).substr-rw( $index, 1 ) = 'A';
say $string;     # abcde
say $new-string; # Abcde
If you wanted to stay away from a mutating operation:
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
                        To change just a single letter in the string, you can use the subst method on type 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'
The "indexing" for :nth starts at 1. What :nth really means is "replace nth match alone". Because our regex only matches a single character, :nth acts like an index (even though it technically is not).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With