在 perl 中 \*STDIN 与 STDIN 相同吗?

sno*_*yjc 2 perl stdin reference typeglob

我是Pythonizer的作者,我正在尝试将 CGI.pm 的代码从标准 perl 库转换为 Python。我在read_from_client中遇到了这段代码:

read(\*STDIN, $$buff, $len, $offset)
Run Code Online (Sandbox Code Playgroud)

和 just是\*STDIN一样的吗STDIN?我不明白他们为什么这样使用它。感谢您的帮助!

该模块还引用了\*main::STDIN- 这也一样吗STDIN(我会在 python 中将 其简单地翻译STDIN为)?代码sys.stdin

foreach my $fh (
    \*main::STDOUT,
    \*main::STDIN,
    \*main::STDERR,
) { ... }
Run Code Online (Sandbox Code Playgroud)

bri*_*foy 5

我建议您不要逐行翻译 CGI.pm,而是建议您了解该接口,然后执行 Python 会执行的任何操作。或者,更好的是,忘记它的存在。通常看起来翻译将是一种直接替代,但由于您将在新语言中使用的库和结构足够不同,因此您只会产生新的错误。既然无论如何你都会制造新的错误,你不妨做一些更聪明的事情。

但是,我对你的情况一无所知,所以让我们直接回答问题吧。

您正在查看:

# Read data from a file handle
sub read_from_client {
    my($self, $buff, $len, $offset) = @_;
    local $^W=0;                # prevent a warning
    return $MOD_PERL
        ? $self->r->read($$buff, $len, $offset)
        : read(\*STDIN, $$buff, $len, $offset);
}
Run Code Online (Sandbox Code Playgroud)

不用担心 Perl 代码,只需在 Python 中执行任何您需要执行的操作即可满足接口要求。给定一个缓冲区和一个长度,从文件句柄中获取更多数据。由于您没有处理 mod_perl (我猜,因为您会怎么做?),您可以忽略那里的大多数内容。


和是对 typeglob 的引用,这是一种跟踪具有相同名称的所有 Perl 变量(标量、数组、散列、子例程、文件句柄和其他一些变量)的方法\*main::STDIN\*STDIN标识符STDIN是默认情况下的特殊情况变量main,因此在前面添加包main::可能只是为了让开发人员感到舒适。

当您在想要处理文件句柄的地方使用这些引用时,将使用 glob 类型的文件句柄部分。这只是传递标识符STDIN并让其他东西将其用作文件句柄的一种方法。

您将其视为传递命名的标准文件句柄的一种方式。

read文件句柄(或对 typeglob 的引用)作为其第一个参数。

在 python 中,你会做类似的事情sys.stdin.read(...)