use strict состоит из трех частей. Одна из них ( use strict "subs") запрещает неправильное использование barewords.

Что это значит?

Без этого ограничения такой код бы сработал и выдал "hello".

my $x = hello;
print "$x\n";    # hello

Это само по себе странно, потому что мы привыкли помещать строки в кавычки, но Perl по умолчанию позволяет использовать "голые слова" (barewords) - слова без кавычек - в качестве строк.

Поэтому код из примера выше выдаст "hello".

Ну, по крайней мере пока кто-нибудь не добавит подпрограмму "hello" в начало вашего скрипта:

sub hello {
  return "zzz";
}

my $x = hello;
print "$x\n";    # zzz

Да. В этой версии perl видит подпрограмму hello(), вызывает ее и присваивает возвращаемое ей значение переменной $x.

Однако, если кто-то переместит эту подпрограмму в конец файла, после присвоения, perl внезапно перестанет видеть ее во время присвоения, и мы снова получаем "hello" в $x.

Нет, вы не хотите попасть в такую неразбериху в какой-то момент. А возможно, никогда. Добавив в свой код use strict, вы укажете perl'у, что bareword "hello" в вашем коде недопустим, и избежите этой путаницы.

use strict;

my $x = hello;
print "$x\n";

Получим следуюшую ошибку:

Bareword "hello" not allowed while "strict subs" in use at script.pl line 3.
Execution of script.pl aborted due to compilation errors.

Правильное использование bareword'ов

Существуют другие места, где bareword'ы могут использоваться, даже когда применено use strict "subs".

В первую очередь, имена подпрограмм, которые мы создаем, по сути являются bareword'ами. Допустим.

Кроме того, когда мы указываем элемент хэша, мы можем поставить bareword в фигурных скобках, и слова по левую сторону толстой стрелки (=>) тоже могут обходиться без кавычек:

use strict;
use warnings;

my %h = ( name => 'Foo' );

print $h{name}, "\n";

В обоих случаях "name" - это bareword, но такое использование допустимо даже при включенном strict.