在Perl中,为什么不能使用__DATA__作为可搜索的文件句柄?

时间:2018-08-30 20:00:27

标签: perl seek

通过典型的Slurp读取DATA。尝试将DATA用作可以进行查找的文件句柄不起作用。有谁能指出我必须犯的明显错误?

代码:

(http://images\.(\d+)_120\*75)(?![\s\S]*\1)

运行while()循环:

#!/usr/bin/env perl

use strict;
use warnings;

if ($ARGV[0] eq 'seek' ) {
    my $log_fh = \*DATA;
    $log_fh->seek(64,0);
    print "\n-- 64 --\n",join ("", <$log_fh> );
} else {
    while (<DATA>) {
        print $_;
    }
}

exit;

__DATA__
01234567890123456789
1234567890123456789
1234567890123456789
12
X <- That X is the 64th char in
this file.
Y <- That Y is the 106th char in this file.
junk
more junk.
bye!

$ perl file_from_data.pl slurp
01234567890123456789
1234567890123456789
1234567890123456789
12
X <- That X is the 64th char in
this file.
Y <- That Y is the 106th char in this file.
junk
more junk.
bye!

运行seek(),它似乎不是从 DATA 开始,而是脚本的开始:

$ perl file_from_data.pl slurp
01234567890123456789
1234567890123456789
1234567890123456789
12
X <- That X is the 64th char in
this file.
Y <- That Y is the 106th char in this file.
junk
more junk.
bye!

这是旧的Perl:

$ perl file_from_data.pl seek

-- 64 --
'seek' ) {
    my $log_fh = \*DATA;
    $log_fh->seek(64,0);
    print "\n-- 64 --\n",join ("", <$log_fh> );
} else {
    while (<DATA>) {
        print $_;
    }
}

exit;

__DATA__
01234567890123456789
1234567890123456789
1234567890123456789
12
X <- That X is the 64th char in
this file.
Y <- That Y is the 106th char in this file.
junk
more junk.
bye!

1 个答案:

答案 0 :(得分:7)

  

运行seek(),它似乎不是从 DATA 开始,而是脚本的开始

我认为您根本没有犯任何错误。就是这样。 DATA是在源文件上打开的文件句柄。在该文件句柄的第一个read()之前,文件指针位于文件中__DATA__标记之后。但是您可以使用seek()将文件指针移到文件中的所有位置。

我想实现“特殊情况”文件句柄将变得更加困难,该文件句柄无法在其初始位置之前移回。