in reply to loop iterator in a string

the "simple" way is using eval

DB<53> say for eval "2,4..9" 2 4 5 6 7 8 9

NB: this might lead to problems with large intervals though, because foreach can't tell when to iterate lazily. But good enough if you don't intend to scale large.

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

Replies are listed 'Best First'.
Re^2: loop iterator in a string
by Anonymous Monk on Sep 27, 2021 at 18:41 UTC
    Oh that's brilliant Rolf! I totally forgot about eval. This is definitely good enough for my use case. Thank you!

      Please be aware that eval with anything other than a fixed, literal string (i.e. no variables interpolated in) has the potential to introduce security issues or other subtle bugs.

        I think rejecting any $str containing anything which isn't a cipher, comma or dot prior to eval $str should be good enough

        DB<53> $EVIL= ',@{[say "kill all kitties!"]}' DB<54> $str = "2,4..9" DB<55> p $str =~ m/[^0-9,.]/ # OK DB<56> $str .= $EVIL DB<57> p $str =~ m/[^0-9,.]/ # NOT OK 1 DB<58> eval $str kill all kitties!

        update

        in order to avoid syntax error you need to check $@ to see if the eval was successful. NB line 82, not all errors are caught tho

        DB<80> @list = eval ",1..3"; unless($@){say for @list } DB<81> @list = eval "1..3"; unless($@){say for @list } 1 2 3 DB<82> @list = eval "1.3"; unless($@){say for @list } 1.3

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery