很抱歉这个令人困惑的标题,但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);
答案 0 :(得分:2)
当前正由空<>
读取的文件称为ARGV
。
请注意,<>
周围存在一些神奇的行为:当您到达当前正在访问的文件的末尾时,perl将自动打开并开始阅读@ARGV
中的下一个文件,如果有&#39那里有什么东西。 (此时您不能够seek
返回您之前的位置,因为ARGV
现在指的是不同的文件!)
答案 1 :(得分:1)
<>
从ARGV
读取。我刚刚测试过,您可以在当前打开的文件中进行搜索(假设它当前正在从文件中读取)。
这是你正在做的一件很奇怪的事情(可能是XY problem)。您可能最好循环@ARGV
并自行打开文件,而不是使用<>
。