2

次のようなコードを実行する場合:

use strict;
print Dumper "something";

何も出力されず、コンパイルおよび実行時にエラーは発生しません。なぜこれが起こるのですか?strictがこのコードの実行を妨げないのはなぜですか? Dumper が不明であるにもかかわらず、実行時にエラーが発生しないのはなぜですか?

それらが明示的に有効になっていると警告が生成されることは知っていますが、このコードが何らかの形で「正しい」と見なされる理由に興味があります。

4

2 に答える 2

11

標準のボイラープレートから始めた場合は、次のことがわかります。

#!/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 になります。しかし、その名前でハンドルを開いたことがないため、初期化されていないファイルハンドルに出力しています。DumperprintDumper print

私のボイラープレートを使用してください。 お願いします!

于 2010-11-25T00:50:18.373 に答える
7

の有効な構文の 1 つは次のとおりですprint

print FILEHANDLE LIST

あなたのプログラムでは、Perl はDumperファイルハンドル グロブとして扱っています。

警告を有効にしてこのコードを実行すると、次のことがわかります。

print() on unopened filehandle Dumper at ...

于 2010-11-25T00:48:35.020 に答える