<>的文件名是什么?文件?

时间:2014-05-31 04:27:30

标签: perl

很抱歉这个令人困惑的标题,但stackoverflow不会让我使用<> ... 好的,这是一个问题: 由于<>可以应用于STDIN或命令行参数中的文件名,如果我想在这个文件上调用seek(),那么这种情况下的文件句柄是什么?感谢。

语法错误:

syntax error at ./parsejobs.pl line 17, near ") {"
syntax error at ./parsejobs.pl line 40, near "}"

代码:

use strict;
use warnings;

my ($fh, $curr_job, %jobs, @roots);

@ARGV == 1 or die "usage";
my ($qfn) = @ARGV;
open($fh, '<', $qfn)

while ( <$fh> ) {                                                     <----line 17
  next unless my ($op, $id) = /(\w+): ([.\w-]+)/;
  my $pos = tell();
  if ($op eq 'insert_job') {
    push @roots, $curr_job if $curr_job;
    $curr_job = $id;
    $jobs{$id} = [] unless $jobs{$id};
  }
  elsif ($op eq 'box_name') {
    push @{ $jobs{$id} }, $curr_job;
    peek:    while ( <$fh> ) {
        next peek unless my ($po, $cmd) = /(\w+): ([.\s\w-]+)/;
        if ($po eq 'command' ) {
                push @{ $jobs{$curr_job} }, "$cmd";
                last peek;
        }
        last peek if /^$/;
    }
    if ( $pos != tell() ) {
            seek $fh, $pos, 0;
    }
    $curr_job = undef;
  }
}                                                           <------line 40
push @roots, $curr_job if $curr_job;

display_tree($_) for @roots;

sub display_tree {
  my ($root, $indent) = (@_, 0);
  printf "%s%s\n", ' ' x 4 x $indent, $root;
  display_tree($_, $indent + 1) for @{ $jobs{$root} };
}
close($fh);

2 个答案:

答案 0 :(得分:2)

当前正由空<>读取的文件称为ARGV

请注意,<>周围存在一些神奇的行为:当您到达当前正在访问的文件的末尾时,perl将自动打开并开始阅读@ARGV中的下一个文件,如果有&#39那里有什么东西。 (此时您能够seek返回您之前的位置,因为ARGV现在指的是不同的文件!)

答案 1 :(得分:1)

<>ARGV读取。我刚刚测试过,您可以在当前打开的文件中进行搜索(假设它当前正在从文件中读取)。

这是你正在做的一件很奇怪的事情(可能是XY problem)。您可能最好循环@ARGV并自行打开文件,而不是使用<>