December 28th, 2007 by eric
I came across a situation where I needed to access the process table in Perl. The problem that i found was that the best accessor Proc::ProcessTable only retrieved an array. Since it seems fairly senseless to keep looping over an array to find the exact process id that I want, you may want to turn it into a hash.
use strict;
use warnings;
use Proc::ProcessTable;
# Create a new process table object
my ($pt) = new Proc::ProcessTable;
# Initialize your process table hash
my (%pt_hash);
# Get the fields that your architecture supports
my (@fields) = $pt->fields;
# Outer loop for each process id
foreach my $proc ( @{$pt->table} ) {
# Inner loop for each field within the process id
for my $field (@fields) {
# Add the field to the hash
$pt_hash{$proc->pid}{$field} = $proc->$field();
}
}
It’s just as simple as that. If you want to be sure that its in there. At the end of the file add these two lines for proof:
use Data::Dumper;
print Dumper \%pt_hash;
The hash is organized with the keys being the process ids. There is another hash underneath it with all the fields as hash keys.
March 15th, 2007 by eric
Description: File::ReadBackwards works similar to the linux shell command tac. It reads the file line by line strarting from the end of the file.
CPAN: File::ReadBackwards
Example 1:
Being a System’s Administrator, I am usually doing some analysis on a large logfile. Therefore, I may not need all the information contained in the log. This may be especially true if the logs only get rotated once a day or once a week and I don’t need all the information in the log file. Using File::ReadBackwards in combination with a date and time calculation module, I can take only the amount of time I want to use from the logs and then stop processing there. Since we aren’t covering the date calculations here, I will push those out to another subroutine that we will assume works.
# Always use these
use strict;
use warnings;
# Use the module itself
use File::ReadBackwards;
# Define the log file to be read
my $log = "/var/log/log_file";
# Open the logfile by tie'ing it to the module
tie *LOG, "File::ReadBackwards", "$log"
or die ("$log tie error: $!");
# Iterate over the logfile
while (my $line = ) {
# Split the log line
my @entry = split(/\s+/, $line);
# Take the timestamp and check if we
# have hit our threshold yet
# Break loop if we have
last if (time_reached($entry[0]) == 1);
}
# Cleanup
untie (*LOG);
March 9th, 2007 by eric
Description: The author of this module notes that it is best used, especially by him, when reading or manipulating log files. I have a tendency to use it for the exact same thing, especially when looking for context around captured lines.
CPAN: File::Bidirectional
Note:
Although I would like to note that using the tie’d interface as I have done takes approximately 2 1/2 times as long as a regular file read according to benchmarks, it is still a very handy tool and allows one not to reinvent the wheel.
Example 1:
Here we are going to go through a log file and when we hit the time stamp we want, we are going to change directions and go back through. There is no real reason to change direction here, I am merely demonstrating how it would be accomplished.
# Always use these
use strict;
use warnings;
# Use the module itself
use File::Bidirectional;
# Define the log file to be read
my $log = "/var/log/log_file";
# Open the logfile by tie'ing it to the module
# This is exactly the same as File::ReadBackwards
tie *LOG, "File::Bidirectional", "$log", {mode => 'backward'}
or die ("$log tie error: $!");
# Iterate over the logfile
while (my $line = ) {
# Split the log line
my @entry = split(/\s+/, $line);
# Take the timestamp and check if we
# have hit our threshold yet
# Get the line # then change direction
if (time_reached($entry[0]) == 1) {
$line_num = (tied *LOG)->line_num();
(tied *LOG)->switch();
}
}
# Cleanup
untie (*LOG);