Использование Dumper не вызывает сбой - PullRequest
2 голосов
/ 25 ноября 2010

при запуске такого кода:

use strict;
print Dumper "something";

ничего не распечатывается и не возникает никаких ошибок во время компиляции и выполнения. Почему это происходит? Почему strict не препятствует запуску этого кода? Почему нет ошибки во время выполнения, хотя Dumper неизвестен?

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

Ответы [ 2 ]

11 голосов
/ 25 ноября 2010

Если бы вы начали со стандартного шаблона, то вы бы знали:

#!/usr/bin/env perl
#
# name_of_program - what the program does as brief one-liner
#
# Your Name <your_email@your_host.TLA>
# Date program written/released
#################################################################

use 5.10.0;

use utf8;
use strict;
use autodie;
use warnings FATAL => "all";

#  ⚠ change to agree with your input: ↓
use open ":std" => IN    => ":encoding(ISO-8859-1)",
                   OUT   => ":utf8";
#  ⚠ change for your output: ↑ — *maybe*, but leaving as UTF-8 is sometimes better

END {close STDOUT}

our $VERSION = 1.0;

$| = 1;

Ответ в том, что ваша программа синтаксически, но не семантически верна. Вы печатаете "something" в неоткрытом * file5le-объекте Dumper, потому что Dumper находится в дополнительном слоте для вызова метода print. Это делает Dumper print инвокантом. Но вы никогда не открывали дескриптор с таким именем, поэтому вы печатаете в неинициализированный файловый дескриптор.

Используй мой шаблон. ПОЖАЛУЙСТА!

7 голосов
/ 25 ноября 2010

Один из допустимых синтаксисов для print:

print FILEHANDLE LIST

В вашей программе Perl рассматривает Dumper как глобус дескриптора файла.

Запуск этого кода с включенными предупреждениями покажетВы:

print() on unopened filehandle Dumper at ...

...