我读过的所有文档都说__DATA__“特殊文件句柄”之类的内容,但它不是文件句柄,不是吗?
https://perldoc.perl.org/perldata#Special-Literals
默认情况下,当 Perl 读取文件来解析源代码时,DATA 文件句柄具有适当的 PerlIO 层。”
#!/bin/env perl
open($config, "<test.pl");
$config_copy = $config; # let's me copy a filehandle
while (<$config_copy>) {
print $_; # works just fine
}
$config_copy = __DATA__; # FAIL syntax error does not let me copy a filehandle
while (<$config_copy>) {
print $_;
}
__DATA__
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
我基本上想将文件句柄传递给配置文件读取器函数或传递__DATA__(如果存在),但读取器函数位于与段不同的包中__DATA__,因此我需要__DATA__作为参数传递,因为__DATA__只能从同一个包或文件它在其中声明,但 Perl 并不__DATA__像其他文件句柄那样对待。它不能作为函数参数进行赋值或传递。
------ package ConfigReader ------------------
package ConfigReader;
sub ReadConfig {
my ($handle) = @);
while($handle) {
# blah blash
}
}
----------- application ------------------
use ConfigReader;
# it won't let me set a scalar to __DATA__.
# but it lets scalars be set to other file handles.
my $config_handle = __DATA__ # set up default, FAIL syntax error
open($config_handle, "<$config_file_name")
my $configs = ConfigReader::ReadConfig($config_handle);
--------------------------
Run Code Online (Sandbox Code Playgroud)
正如您从文档中引用的那样:
默认情况下,文件
DATA句柄具有 Perl 读取文件以解析源代码时所处的任何 PerlIO 层。
它还这样说:
__DATA__ 之后的文本可以通过 filehandle 读取
PACKNAME::DATA,其中PACKNAME是遇到 __DATA__ 标记时当前的包。
文件句柄称为DATA,而不是__DATA__。在某些情况下,您可能需要通过引用包含它的 glob 来引用它 -\*DATA但现在这种情况似乎很少见。
所以尝试:
$config_copy = DATA;
Run Code Online (Sandbox Code Playgroud)