我是 Pythonizer 的作者我正在尝试将 CGI.pm 的代码从标准 perl 库转换为 Python。我在 read_from_client 中看到这段代码:
read(\*STDIN, $$buff, $len, $offset)
是\*STDIN
与 STDIN
相同?我不明白他们为什么这样使用它。感谢您的帮助!
该模块还引用了 \*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/