Why does the Perl 6 state variable behave differently for different files?

I have 2 test files. In one file I want to extract the middle section using a state variable as a switch, and in another file I want to use a state variable to hold the sum of the numbers seen.

File one:

section 0; state 0; not needed
= start section 1 =
state 1; needed
= end section 1 =
section 2; state 2; not needed

File two:

1
2
3
4
5

The code for processing the file is one:

cat file1 | perl6 -ne 'state $x = 0; say " x is ", $x; if $_ ~~ m/ start / { $x = 1; }; .say if $x == 1; if $_ ~~ m/ end / { $x = 2; }'

and the result with errors:

 x is (Any)
Use of uninitialized value of type Any in numeric context
  in block  at -e line 1
 x is (Any)
= start section 1 =
 x is 1
state 1; needed
 x is 1
= end section 1 =
 x is 2
 x is 2

And the code to process the file is two -

cat file2 | perl6 -ne 'state $x=0; if $_ ~~ m/ \d+ / { $x += $/.Str; } ; say $x; '

and results are expected:

1
3
6
10
15

What causes the state variable not to initialize in the first code, but good in the second code?

I found that in the first code , if I make a state variable something like addition, then it works. Why is that?

cat file1 | perl6 -ne 'state $x += 0; say " x is ", $x; if $_ ~~ m/ start / { $x = 1; }; .say if $x == 1; if $_ ~~ m/ end / { $x = 2; }'

# here, $x += 0 instead of $x = 0; and the results have no errors:

 x is 0
 x is 0
= start section 1 =
 x is 1
state 1; needed
 x is 1
= end section 1 =
 x is 2
 x is 2

Thanks for any help.

+4
1

smls :

Rakudo. -:
echo Hello | perl6 -ne 'state $x = 42; dd $x'.
, -n -p. , //= (, undefined):
state $x; $x //= 42;

+2

Source: https://habr.com/ru/post/1664827/


All Articles