Как использовать "сказать" в Perl onlines без объявления "use v5.11" или подобного?

В новых Perls есть команда "say", которая ведет себя как println:

$ perl -e 'use v5.11; say "qqq"'
qqq

но это немного громоздко для использования в oneliners, так как нужно объявить версию...

$ perl -e 'say "qqq"'
String found where operator expected at -e line 1, near "say "qqq""

$ perl -e 'print "qqq\n"'
qqq # but \n is easy for forget and "print" is longer...

Есть ли способ включить say без добавления косой черты (может быть уже много в строке) или перемещение курсора влево, чтобы ввести use v5.11 в командной строке?

Ответ 1

Если вы вызываете perl из командной строки, вы можете использовать флаг -E

  • -E program: как -E, но включает все дополнительные функции

Как показано:

$ perl -E 'say "qqq"'
qqq

Ответ 2

Как опция -E, я использую -l, что делает print работать как say (добавить новую строку). Я использую это большую часть времени самостоятельно, и я считаю, что он полностью заменяет say.

$ perl -lwe'print "foo"'
foo

То, что действительно делает, устанавливается $\ на текущее значение $/, что приводит к тому, что параметр командной строки -0 влияет на параметр -0, и это то, что нужно посмотреть. Порядок переключателей имеет значение, так что

$ perl -l -00 -e'print "hi"'

работает как ожидалось, но

$ perl -00 -l -e'print "hi"'

Нет (он устанавливает $\ в "\n\n", для режима абзаца).

Этот последний случай практичен при использовании режима абзаца, чтобы легко распечатать абзацы. В общем, есть много преимуществ при использовании -l.

Технически, print длиннее, чем say, но мои пальцы уже набирают print автоматически, а print находится в фактическом случае короче print^H^H^H^H^Hsay.. (backspace, который есть)

Ответ 3

perl -E'say "foo";'                   # 5.10+ (Forward-incompatible!)
perl -Mfeature=say -e'say "foo";'     # 5.10+
perl -M5.010 -e'say "foo";'           # 5.10+
perl -e'CORE::say "foo";'             # 5.16+

Смотрите здесь о том, как -E может вызвать проблемы.