发布于 2022-12-04 16:46:41
与其逐行转换CGI.pm行,我建议您理解接口,然后做任何Python会做的事情。或者,更好的是,忘记它的存在。翻译似乎常常是一种替代,但由于您将在新语言中使用的库和结构非常不同,所以您只会产生新的bug。既然你要制造新的bug,你最好做些更聪明的事情。
但是,我对你的情况一无所知,所以让我们谈谈字面上的问题。
你看到的是:
# 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是对类型same的引用,这是一种跟踪所有同名的Perl变量的方法(标量、数组、哈希、子例程、文件句柄等)。STDIN标识符是一个特例变量,默认情况下是main,因此在前面添加包main::可能只是开发人员的安慰。
当您在希望处理文件句柄的地方使用这些引用时,将使用类型glob的文件句柄部分。它只是一种传递标识符STDIN并让其他东西将其用作文件句柄的方法。
您认为这是传递命名的标准文件句柄的一种方式。
read接受一个文件句柄(或对typeglob的引用)作为其第一个参数。
在python中,您会做类似于sys.stdin.read(...)的事情。
发布于 2022-12-04 17:05:13
通常可以使用以下文件句柄:
*STDIN{IO})*STDIN)的全局\*STDIN)的glob的引用"STDIN")的glob名称。期望文件句柄的内置操作符允许您在提供glob时省略*。例如,read( FH, ... )的意思是read( *FH, ... )。
期望文件句柄的内置函数应该接受所有这些。所以你可以做以下任何一件事:
read( *STDIN{IO}, ... )read( STDIN, ... )read( *STDIN, ... )read( \*STDIN, ... )read( "STDIN", ... )。它们将产生同样的效果。
第三方库可能接受全局和对全局的引用,它们也应该期望IO对象。我希望对将名称作为字符串提供的支持最少。你的里程可能会不同。
对glob (\*FH)的引用不会出错,因为这是open( my $fh, ... )产生的结果。
https://stackoverflow.com/questions/74678226
复制相似问题