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

标签 perl reference stdin typeglob

我是 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,我建议您了解接口(interface),然后执行 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 中做任何你需要做的来满足接口(interface)。给定缓冲区和长度,从文件句柄中获取更多数据。由于您没有处理 mod_perl(我猜,因为您会怎么做?),您可以忽略那里的大部分内容。


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

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

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

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

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

关于perl - 在 perl 中,\*STDIN 与 STDIN 相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74678226/

相关文章:

javascript - 带有 perl 后端的 Ajax 应用程序 - 如何?

linux - 使用 Perl Unix 命令转义序列

php - 为什么当 PHP 数组的元素是引用分配时它会被修改?

C++返回对临时的引用

c++ - 无法将此指针从 const Class<T> 转换为 Class<T>&

python - 如何在不等待输入的情况下检查可能为空的标准输入?

mysql - 如何通过表中的 "numeric"位置选择列?

linux - 解压文件而不使用第一个目录

java - 使用 Java Scanner 顺序读取 stdin 时抛出异常

带有 sys.stdin 的 Python 程序出错 - Hadoop Streaming