where in the $[ version all you get is a merek <2> sassign vKS/2 ->l i <$> const(IV 0) s ->j - <1> ex-rv2sv sKRM*/1 ->k j <$> gvsv(*a) s ->k
i <;> nextstate(main 2 x.pl:4) v ->j
The effect of changing the array base index is achieved through virtual machine state, which is actually independent from the runtime value of $[. The value accessible through $[ is kept synched to the internal state but not vice versa.
Full B::Concise output follows:
$ cat x.pl my @elements = qw/ 0 1 2 3 4 5 6 7 8 9 /; $[ = 0; print $elements[1], "\n"; $[ = 1; print $elements[1], "\n"; if ($[ == 1) { $[ = 0; print $elements[1], "\n"; } $ perl -MO=Concise x.pl 18 <@> leave[@elements:1,4] vKP/REFC ->(end) 1 <0> enter ->2 2 <;> nextstate(main 1 x.pl:1) v ->3 g <2> aassign[t2] vKS ->h - <1> ex-list lKP ->e 3 <0> pushmark s ->4 4 <$> const(PV "0") s ->5 5 <$> const(PV "1") s ->6 6 <$> const(PV "2") s ->7 7 <$> const(PV "3") s ->8 8 <$> const(PV "4") s ->9 9 <$> const(PV "5") s ->a a <$> const(PV "6") s ->b b <$> const(PV "7") s ->c c <$> const(PV "8") s ->d d <$> const(PV "9") s ->e - <1> ex-list lK ->g e <0> pushmark s ->f f <0> padav[@elements:1,4] lRM*/LVINTRO ->g h <;> nextstate(main 2 x.pl:3) v ->i i <;> nextstate(main 2 x.pl:4) v ->j o <@> print vK ->p j <0> pushmark s ->k m <2> aelem sK/2 ->n k <0> padav[@elements:1,4] sR ->l l <$> const(IV 1) s ->m n <$> const(PV "\n") s ->o p <;> nextstate(main 2 x.pl:6 $[=1) v ->q q <;> nextstate(main 2 x.pl:7 $[=1) v ->r w <@> print vK ->x r <0> pushmark s ->s u <2> aelem sK/2 ->v s <0> padav[@elements:1,4] sR ->t t <$> const(IV 1) s ->u v <$> const(PV "\n") s ->w x <;> nextstate(main 4 x.pl:9) v ->y 17 <@> leave vKP ->18 y <0> enter v ->z z <;> nextstate(main 2 x.pl:10) v ->10 10 <;> nextstate(main 2 x.pl:11) v ->11 16 <@> print vK ->17 11 <0> pushmark s ->12 14 <2> aelem sK/2 ->15 12 <0> padav[@elements:1,4] sR ->13 13 <$> const(IV 1) s ->14 15 <$> const(PV "\n") s ->16 x.pl syntax OK
$ cat x.pl my @elements = qw/ 0 1 2 3 4 5 6 7 8 9 /; $a = 0; print $elements[1], "\n"; $a = 1; print $elements[1], "\n"; if ($a == 1) { $a = 0; print $elements[1], "\n"; } $ perl -MO=Concise x.pl 1l <@> leave[@elements:1,4] vKP/REFC ->(end) 1 <0> enter ->2 2 <;> nextstate(main 1 x.pl:1) v ->3 g <2> aassign[t2] vKS ->h - <1> ex-list lKP ->e 3 <0> pushmark s ->4 4 <$> const(PV "0") s ->5 5 <$> const(PV "1") s ->6 6 <$> const(PV "2") s ->7 7 <$> const(PV "3") s ->8 8 <$> const(PV "4") s ->9 9 <$> const(PV "5") s ->a a <$> const(PV "6") s ->b b <$> const(PV "7") s ->c c <$> const(PV "8") s ->d d <$> const(PV "9") s ->e - <1> ex-list lK ->g e <0> pushmark s ->f f <0> padav[@elements:1,4] lRM*/LVINTRO ->g h <;> nextstate(main 2 x.pl:3) v ->i k <2> sassign vKS/2 ->l i <$> const(IV 0) s ->j - <1> ex-rv2sv sKRM*/1 ->k j <$> gvsv(*a) s ->k l <;> nextstate(main 2 x.pl:4) v ->m r <@> print vK ->s m <0> pushmark s ->n p <2> aelem sK/2 ->q n <0> padav[@elements:1,4] sR ->o o <$> const(IV 1) s ->p q <$> const(PV "\n") s ->r s <;> nextstate(main 2 x.pl:6) v ->t v <2> sassign vKS/2 ->w t <$> const(IV 1) s ->u - <1> ex-rv2sv sKRM*/1 ->v u <$> gvsv(*a) s ->v w <;> nextstate(main 2 x.pl:7) v ->x 12 <@> print vK ->13 x <0> pushmark s ->y 10 <2> aelem sK/2 ->11 y <0> padav[@elements:1,4] sR ->z z <$> const(IV 1) s ->10 11 <$> const(PV "\n") s ->12 13 <;> nextstate(main 4 x.pl:9) v ->14 - <1> null vKP/1 ->1l 17 <|> and(other->18) vK/1 ->1l 16 <2> eq sK/2 ->17 - <1> ex-rv2sv sK/1 ->15 14 <$> gvsv(*a) s ->15 15 <$> const(IV 1) s ->16 1k <@> leave vKP ->1l 18 <0> enter v ->19 19 <;> nextstate(main 2 x.pl:10) v ->1a 1c <2> sassign vKS/2 ->1d 1a <$> const(IV 0) s ->1b - <1> ex-rv2sv sKRM*/1 ->1c 1b <$> gvsv(*a) s ->1c 1d <;> nextstate(main 2 x.pl:11) v ->1e 1j <@> print vK ->1k 1e <0> pushmark s ->1f 1h <2> aelem sK/2 ->1i 1f <0> padav[@elements:1,4] sR ->1g 1g <$> const(IV 1) s ->1h 1i <$> const(PV "\n") s ->1j
Makeshifts last the longest.
In reply to Re^2: *a=*[; bug?
by Aristotle
in thread *a=*[; bug?
by ambrus
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |