我正急于从我的数据集中获取一些内容。
#!/usr/local/bin/perl
use Date::Calc qw(Add_Delta_Days);
my @just_ecps;
my @folder_dates;
my @ecp_dot_tee_array = `grep ISLAND ~/data/files/grit.t`;
foreach (@ecp_dot_tee_array){
($ecp, undef, undef, undef, undef, undef) = split (/\s+/, $_);
push (@just_ecps, $ecp);
}
for ($h = 1; $h <= 5; $h++){
my (undef, undef, undef, $day, $month, $year) = localtime();
$year+=1900;
$month+=1;
($year, $month, $day) = Add_Delta_Days($year, $month, $day, -$h );
if ($month < 10 ){
$month = "0$month";
}
if ($day < 10 ){
$day = "0$day";
}
push (@folder_dates, "$year$month$day");
}
for ( $j=0; $j <=$#just_ecps ; $j++){
for ($x=0; $x<=$#folder_dates ; $x++){
open FILEHANDLE , "zmore /data/ibprod/archive/$folder_dates[$x]/$just_ecps[$j] /ghistogram.gz | ";
@archive_average = (<FILEHANDLE>);
foreach $line(@archive_average){
if ($line =~ /ave:\s+(\d+\.\d+)\s/){
print $1;
sleep 1;
print "\n";
}
}
}
}
这是我运行程序时得到的 - 我试图得到'无法读取&gt;数据集之外的文件
% ./read_in_ghistogram2
0.00414601
0.0044511
0.00387373
/usr/bin/zmore: line 52: /home/data/archive/20110814/islnd1/ghistogram.gz: No such file or directory
/usr/bin/zmore: line 52: /home/data/archive/20110813/islnd1/ghistogram.gz: No such file or directory
0.00309721
0.00302753
0.00307702
/usr/bin/zmore: line 52: /home/data/archive/20110814/islnd2/ghistogram.gz: No such file or directory
/usr/bin/zmore: line 52: /home/data/archive/20110813/islnd2/ghistogram.gz: No such file or directory
0.00324729
0.00295381
0.00301736
/usr/bin/zmore: line 52: /home/data/archive/20110814/islnd3/ghistogram.gz: No such file or directory
/usr/bin/zmore: line 52: /home/data/archive/20110813/islnd3/ghistogram.gz: No such file or directory
我尝试将它们从while循环中过滤掉,但是它不起作用,并且程序中的第52行不是,它只会转到42
for ( $j=0; $j <=$#just_ecps ; $j++){
for ($x=0; $x<=$#folder_dates ; $x++){
#print "/home/ibprod_archive/$folder_dates[$x]/$just_ecps[$j]/ghistogram.gz";
open FILEHANDLE , "zmore /data/archive/$folder_dates[$x]/$just_ecps[$j]/ghistogram.gz | ";
while (<FILEHANDLE>) {
next if ($_ =~ '/No such file or directory/');
push (@archive_average,$_);
foreach $line(@archive_average){
if ($line =~ /\save:\s+(\d+\.\d+)\s/){
print $line;
sleep 1;
}
}
}
}
答案 0 :(得分:2)
Line 52
引用zmore
脚本中的行,而不是perl脚本中的行。
要解决您的问题,请先测试perl脚本中是否存在该文件,然后再将其移交给其他人。
my $archive = "/data/archive/$folder_dates[$x]/$just_ecps[$j]/ghistogram.gz";
next unless (-r $archive);
-r
检查文件是否存在且当前用户是否可读。所以next unless (-r $file)
将转到循环的下一次迭代,除非该文件存在且可读。
(这很有趣 - 如果在您尝试阅读这些文件时某些内容正在删除(或更改所有权),open
仍然可能会失败。如果这不是安全敏感的话,那就不是太多了担心,但记住这一点。)
两个提示:
zmore
旨在供人类使用,而不是脚本。如果输出是分页的,那么脚本不关心一点。因此,您应该使用gunzip -c $file
(如果您没有gzip -cd
,则可能使用gunzip
,但不确定该open
。close
是否成功,否则您将尝试在某个时刻操纵无效的文件句柄,这会导致更多错误。始终my $archive = "/data/archive/$folder_dates[$x]/$just_ecps[$j]/ghistogram.gz";
next unless (-r $archive);
if (!open(FILEHANDLE, "<", "gunzip -c $archive|")) {
print STDERR "Error processing $archive: $!\n"; # optional
next;
}
while (<FILEHANDLE>) {
...
}
close FILEHANDLE;
你打开了什么。所以我将你的脚本改为:
zmore
最后,正在向STDERR打印/dev/null
错误消息。如果您只想隐藏这些消息(而不是修复它们),只需将其重定向到日志文件(或% ./read_in_ghistogram2 2> errors.log
):
{{1}}