任何解决 __DATA__ 不是文件句柄这一事实的方法,即使它在所有文档中都是这样引用的

Wal*_*ard 3 perl filehandle

我读过的所有文档都说__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)

Dav*_*oss 6

正如您从文档中引用的那样:

默认情况下,文件DATA句柄具有 Perl 读取文件以解析源代码时所处的任何 PerlIO 层。

它还这样说:

__DATA__ 之后的文本可以通过 filehandle 读取PACKNAME::DATA,其中PACKNAME是遇到 __DATA__ 标记时当前的包。

文件句柄称为DATA,而不是__DATA__。在某些情况下,您可能需要通过引用包含它的 glob 来引用它 -\*DATA但现在这种情况似乎很少见。

所以尝试:

$config_copy = DATA;
Run Code Online (Sandbox Code Playgroud)