Я знаю, что это неправильно. Я просто хочу знать, как Perl анализирует это.
Итак, я играл с perl, мне нужно было perl -ne
я набрал perl -ie
поведение было довольно интересным, и я хотелось бы знать, что случилось.
$ echo 1 | perl -ie'next unless /g/i'
Итак, perl Прервано (дамп ядра)
на этом. Чтение perl --help
Я вижу, что -i
принимает расширение для резервных копий.
-i[extension] edit <> files in place (makes backup if extension supplied)
Для тех, кто не знает, -e
просто eval. Итак, я думаю, что могло произойти одно из трех: либо оно было проанализировано как
perl -i -e'next, если только /g/i'
i не получит undef, остальное идет как аргумент eperl -ie 'следующий, если /g/i'
я получаю аргумент e, остальное висит как имя файлаperl -i"-e'next, если только /g/i'"
целое вещь как аргумент iКогда я запускаю
$ echo 1 | perl -i -e'next unless /g/i'
Программа не прерывается. Это наводит меня на мысль, что 'следующее, если только /g/i'
не анализируется как буквальный аргумент для -e
. Однозначно, вышеизложенное будет проанализировано таким образом, и это будет иметь другой результат.
Так что же это? Ну, поигравшись еще немного, я получил
$ echo 1 | perl -ie'foo bar'
Unrecognized switch: -bar (-h will show valid options).
$ echo 1 | perl -ie'foo w w w'
... works fine guess it reads it as `perl -ie'foo' -w -w -w`
Поигравшись с вышеизложенным, я попробовал это...
$ echo 1 | perl -ie'foo e eval q[warn "bar"]'
bar at (eval 1) line 1.
Теперь я совсем запутался..Так как же Perl анализирует это? Наконец, кажется, что вы действительно можете получить команду Perl eval всего лишь -i
. Имеет ли это значение для безопасности?
$ perl -i'foo e eval "warn q[bar]" '