繁体   English   中英

perl中\*STDIN和STDIN一样吗?

[英]In perl is \*STDIN the same as STDIN?

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

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

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

该模块还引用\*main::STDIN - 这是否也与STDIN相同(我会在 python 中将纯STDIN转换为sys.stdin )? 代码

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

与其逐行翻译 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);
}

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


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

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

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

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

在 python 中,您将执行类似sys.stdin.read(...)的操作。

通常可以使用以下文件句柄:

  • 一个 IO object ( *STDIN{IO} )
  • 包含 IO object ( *STDIN ) 的 glob
  • 对包含 IO object ( \*STDIN ) 的 glob 的引用
  • 包含 IO object ( "STDIN" ) 的 glob 的名称

期望文件句柄的内置运算符允许您在提供 glob 时省略* 例如, read( FH, ... )表示read( *FH, ... )

期望文件句柄的内置函数应该接受所有这些。 因此,您可以执行以下任何操作:

  • read( *STDIN{IO}, ... )
  • read( STDIN, ... )
  • read( *STDIN, ... )
  • read( \*STDIN, ... )
  • read( "STDIN", ... )

它们将产生相同的效果。


第三方库可能接受 glob 和对 glob 的引用,它们也应该期望 IO 个对象。 我希望以字符串形式提供名称的支持最少。 你的旅费可能会改变。

go 对 glob ( \*FH ) 的引用不会出错,因为这就是open( my $fh, ... )产生的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM