>
>
> On Sun, Oct 14, 2018 at 11:08 AM Ralph Mellor <ralphdjmel...@gmail.com
> <mailto: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-users@perl.org <mailto:perl6-users@perl.org>> wrote:
>
>          >> On Sun, Oct 14, 2018 at 10:35 AM ToddAndMargo via perl6-users
>          >> <perl6-users@perl.org <mailto:perl6-users@perl.org>
> <mailto:perl6-users@perl.org <mailto:perl6-users@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 );
>         }
>

On 10/14/18 3:12 AM, Ralph Mellor wrote:
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


It was called out by line number.

Also, when you read a web page, you can get back some of
the gosh awful weirdest stuff back.

I am going to switch to "slurp".

Thank you for all the help with this!

Reply via email to