【问题标题】:In perl is \*STDIN the same as STDIN?在 perl 中,\\*STDIN 与 STDIN 相同吗?
【发布时间】:2022-12-05 01:03:34
【问题描述】:

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

read(\*STDIN, $$buff, $len, $offset)

\*STDINSTDIN 是一样的吗?我不明白他们为什么这样使用它。谢谢你的帮助!

该模块还引用了 \*main::STDIN - 这是否也与 STDIN 相同(我会在 python 中将普通的 STDIN 翻译为 sys.stdin)? Code:

foreach my $fh (
    \*main::STDOUT,
    \*main::STDIN,
    \*main::STDERR,
) { ... }

【问题讨论】:

  • 为什么要翻译 CGI.pm?甚至 Perl 人也告诉 Perl 人不要使用那个模块。
  • 我正在为大量使用它的客户翻译一大块软件。
  • 我很好奇将 Perl 代码逐字翻译成新的代码库是怎样的正确答案。

标签: perl reference stdin typeglob


【解决方案1】:

不要逐行翻译,我会建议您了解界面,然后执行 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);
}

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


*main::STDIN*STDIN 是对 typeglob 的引用,这是一种跟踪所有具有相同名称的 Perl 变量(标量、数组、散列、子例程、文件句柄和其他一些)的方法。当您在想要处理文件句柄的地方使用该引用时,将使用 glob 类型的文件句柄部分。这只是一种传递标识符 STDIN 并让其他东西将其用作文件句柄的方法。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    相关资源
    最近更新 更多