次のようなコードを実行する場合:
use strict;
print Dumper "something";
何も出力されず、コンパイルおよび実行時にエラーは発生しません。なぜこれが起こるのですか?strict
がこのコードの実行を妨げないのはなぜですか? Dumper が不明であるにもかかわらず、実行時にエラーが発生しないのはなぜですか?
それらが明示的に有効になっていると警告が生成されることは知っていますが、このコードが何らかの形で「正しい」と見なされる理由に興味があります。
次のようなコードを実行する場合:
use strict;
print Dumper "something";
何も出力されず、コンパイルおよび実行時にエラーは発生しません。なぜこれが起こるのですか?strict
がこのコードの実行を妨げないのはなぜですか? Dumper が不明であるにもかかわらず、実行時にエラーが発生しないのはなぜですか?
それらが明示的に有効になっていると警告が生成されることは知っていますが、このコードが何らかの形で「正しい」と見なされる理由に興味があります。
標準のボイラープレートから始めた場合は、次のことがわかります。
#!/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"
、開かれていないDumper
ファイルハンドルオブジェクトに出力しています。それは's invocant になります。しかし、その名前でハンドルを開いたことがないため、初期化されていないファイルハンドルに出力しています。Dumper
print
Dumper
print
私のボイラープレートを使用してください。 お願いします!
の有効な構文の 1 つは次のとおりですprint
。
print FILEHANDLE LIST
あなたのプログラムでは、Perl はDumper
ファイルハンドル グロブとして扱っています。
警告を有効にしてこのコードを実行すると、次のことがわかります。
print() on unopened filehandle Dumper at ...