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)
我建议您不要逐行翻译 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(...)。
| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |