given (1)
but I've never known perl to optimize lexicals away, even if those who always hold the same constant value. The following two optrees should be identical if perl optimized constant lexicals away:
>perl -MO=Concise -e"my $data = 1; print $data;"
a <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 -e:1) v ->3
5 <2> sassign vKS/2 ->6
3 <$> const[IV 1] s ->4
4 <0> padsv[$data:1,2] sRM*/LVINTRO ->5
6 <;> nextstate(main 2 -e:1) v ->7
9 <@> print vK ->a
7 <0> pushmark s ->8
8 <0> padsv[$data:1,2] l ->9 <-- It uses the lexical,
-e syntax OK not a constant.
>perl -MO=Concise -e"print 1;"
6 <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 -e:1) v ->3
5 <@> print vK ->6
3 <0> pushmark s ->4
4 <$> const[IV 1] s ->5 <-- This is a constant.
-e syntax OK
Perl 5.8.8
Update: Here's another example using code more similar to the OP's:
>perl -MO=Concise -e"my $data = 1; if ($data) { print 'moo' }"
c <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 -e:1) v ->3
5 <2> sassign vKS/2 ->6
3 <$> const[IV 1] s ->4
4 <0> padsv[$data:1,4] sRM*/LVINTRO ->5
6 <;> nextstate(main 4 -e:1) v ->7
- <1> null vK/1 ->c
8 <|> and(other->9) vK/1 ->c <-- "if" not optimized away.
7 <0> padsv[$data:1,4] s ->8 <-- Lex not optimized away.
- <@> scope vK ->-
- <0> ex-nextstate v ->9
b <@> print vK ->c
9 <0> pushmark s ->a
a <$> const[PV "moo"] s ->b
-e syntax OK
>perl -MO=Concise -e"if (1) { print 'moo' }"
6 <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 3 -e:1) v ->3
- <@> scope vK ->6 <-- "if" optimized away.
- <0> ex-nextstate v ->3
5 <@> print vK ->6
3 <0> pushmark s ->4
4 <$> const[PV "moo"] s ->5
-e syntax OK
|