use Text::Diff;
for($count = 0; $count <= 1000; $count++){
my $data_dir="archive/oswiostat/oracleapps.*dat";
my $data_file= `ls -t $data_dir | head -1`;
while($data_file){
print $data_file;
open (DAT,$data_file) || die("Could not open file! $!");
$stats1 = (stat $data_file)[9];
print "Stats: \n";
@raw_data=<DAT>;
close(DAT);
print "Stats1 is :$stats1\n";
sleep(5);
if($stats1 != $stats2){
@diff = diff \@raw_data, $data_file, { STYLE => "Context" };
$stats2 = $stats1;
}
print @diff || die ("Didn't see any updates $!");
}
}
Output:
$ perl client_socket.pl
archive/oswiostat/oracleapps.localdomain_iostat_12.06.28.1500.dat
Stats:
Stats1 is :
Didn't see any updates at client_socket.pl line 18.
Can you tell me why the stats are missing and how to fix it?
Note that I’m answering your original question, why the
stat()seemed to fail, rather than the newly edited question title, which asks something different.This is the fix:
The reason this is the fix is a little murky. Without that
chomp(),$data_filecontains a trailing newline:"some_filename\n". The two argument form ofopen()ignores trailing newlines in filenamesand I don’t know whybecause two-arg open mimics shell behavior. Your call tostat(), however, does not ignore the newline in the filename, so it isstat()ing a non-existent file and thus$stats1isundef.