Almost certainly your problem is elsewhere.

When you refer to a variable as a *value* then you get its *value*.

So:

return $ReturnStr

returns $ReturnStr's *value*, not the variable.

Your code returns such a value, which will be an immutable string.

So I think the error message you're getting is to do with code that
you haven't yet shown.

--
raiph


On Sun, Oct 14, 2018 at 11:08 AM Ralph Mellor <ralphdjmel...@gmail.com>
wrote:

> Are you sure the error message you showed applies to the line you showed?
>
> This code works fine:
>
> spurt 'foo', 'bar';
> my Str $ReturnStr = "";
> $ReturnStr = 'foo'.IO.open.slurp-rest: enc => 'utf8-c8';
> say $ReturnStr; # bar
>
> --
> raiph
>
> On Sun, Oct 14, 2018 at 10:52 AM ToddAndMargo via perl6-users <
> perl6-us...@perl.org> wrote:
>
>> >> On Sun, Oct 14, 2018 at 10:35 AM ToddAndMargo via perl6-users
>> >> <perl6-us...@perl.org <mailto:perl6-us...@perl.org>> wrote:
>> >>
>> >>     On 10/14/18 2:29 AM, Ralph Mellor wrote:
>> >>      > In P6 "assign" means use of `=`.
>> >>      >
>> >>      > And "assign to" means to copy into the thing on the left of the
>> `=`.
>> >>      >
>> >>      > And to copy into something the thing has to be a mutable
>> container.
>> >>      >
>> >>      > The error message is saying that $ReturnStr is bound to an
>> >>      > immutable value (eg a string) not a container.
>> >>      >
>> >>      > So that's presumably a problem with whatever code you've
>> >>      > written that has earlier bound $ReturnStr to an immutable value.
>> >>      >
>> >>      > --
>> >>      > raiph
>> >>
>> >>          my Str $ReturnStr = "";
>> >>
>> >>     I think slurp-rest does not support
>> >>
>> >>            enc => 'utf8-c8'
>> >>
>> >>     :'(
>> >>
>> >>     See my other letter on this thread
>> >>
>>
>> On 10/14/18 2:43 AM, Ralph Mellor wrote:
>> > I just tried slurp-rest with a specified encoding and it worked fine.
>> >
>> > Are you sure you don't bind $ReturnStr between the
>> > declaration you've shiown and the use you've shown?
>> >
>> > --
>> > raiph
>> >
>>
>>
>> If I do, I am not seeing it.  Here is the specific code:
>>
>> sub RunNoShellAll( Str $RunString, Int $StdOut, Int $StdErr, Int $Code ) {
>>
>>     # $RunString   Comnad line to run without a shell
>>     # $StdOur      read and return the STDOUT       1=yes, 0=no
>>     # $StdErr      read and return the STDERR       1=yes, 0=no
>>     # $Code        read and return the return code  1=yes, 0=no
>>
>>     # Note: If reading the STDERR, it is PRESUMED you also will be
>> reading the STDIN.
>>     #       If only reading the return code, it is presumed that you
>> want the STDERR
>>     #          and STDIN to be silent.
>>
>>     # place each value into a cell in an array.  Keep quoted
>>     # values together
>>     # print "Run String = <$RunString>\n";
>>
>>     # returns
>>     #    StdOut as Str $ReturnStr
>>     #    StdErr as Str $ReturnErr
>>     #    Return Code ($?) as Int $RtnCode
>>
>>     my Buf $BufStdErr;
>>     my Str $ReturnStr = "";
>>     my Str $ReturnErr = "";
>>     my Int $RtnCode = 0;
>>     my $proc;
>>
>>     my @RunArray  = $RunString ~~ m:global/ [ '"' <-[ " ]> * '"' | \S+ ]
>> /;
>>
>>     # shells remove the quote, so you have to here as well
>>     for @RunArray.kv -> $index, $value { @RunArray[$index] ~~ s:g/\"//; };
>>     # for @RunArray.kv -> $index, $value { say "\$RunArray[$index] =
>> <$value>"; }; print "\n";
>>
>>     if    $StdErr  { $proc      = run( @RunArray, :err, :out ); }
>>     elsif $StdOut  { $proc      = run( @RunArray,       :out ); }  #
>> STDERR goes to the terminal
>>     else           { $proc      = run( @RunArray, :err, :out ); }  #
>> STDIN and STDERR are silent
>>
>>     if  $Code    { $RtnCode   = $proc.status; }
>>     # if  $StdErr  { $ReturnErr = $$proc.err.slurp-rest( enc =>
>> 'utf8-c8' ); }
>>     # if  $StdOut  { $ReturnStr = $$proc.out.slurp-rest( enc =>
>> 'utf8-c8' ); }
>>     if  $StdErr  { $ReturnErr = $$proc.err.slurp-rest; }
>>     if  $StdOut  { $ReturnStr = $$proc.out.slurp-rest; }
>>     # $ReturnStr = $BufStdErr.decode("utf8-c8") }
>>
>>
>>     return( $ReturnStr, $ReturnErr, $RtnCode );
>> }
>>
>

Reply via email to