Re: Optimize the script



Hi Rob,

I think it finds the bit starting with CK, if matches it stores in $sl($1)
and finally prints the key value as.

keys %sl,

bec's all matches are same it strores only once. am i correct ? Pls correct
me if am wrong.

Many Thanks

Js

On 7/4/08, jet speed <speedjet5@xxxxxxxxxxxxxx> wrote:

Hi Rob,

Great, Thanks it works. Perfect.

I Will explore your recommendation for using seek File option. I will read
some doc.

In your code, Pls explain what this piece of code does.

$sl{$1}++ if /\bID=(CK\w+)/i;


Many Thanks
Js




On 7/4/08, Rob Dixon <rob.dixon@xxxxxxx> wrote:

jet speed wrote:
Hi All,

I put togather a piece of code with some help, to capture the output as
below from a file "cxout1" as below. I am sure this can be written in
few
lines or even differnt way of getting the same out put with use of hash
etc.
Kindly help me to optimize the code. Any help would be much appericated.

output from the script
---------------------------------

The Clarion Array Serial Number is CK200061101100

LUN INFO POLICY-TYPE OWNER PSEUDO DEVICE
LUN 415 policy=CLAROpt current=SP
A emcpower3a
LUN 815 policy=CLAROpt current=SP
B emcpower4a

file contents cxout1

-----------------------------

Pseudo name=emcpower3a
CLARiiON ID=CK200061101100 [JAZZ]
Logical device ID=600601601496160012288D48703EDB11 [LUN 415]
state=alive; policy=CLAROpt; priority=0; queued-IOs=0
Owner: default=SP A, current=SP A

==============================================================================
---------------- Host --------------- - Stor - -- I/O Path - --
Stats
---
### HW Path I/O Paths Interf. Mode State Q-IOs
Errors

==============================================================================
2310 pci@1c/pci@1/lpfc@4 c3t20d0s0 SP A0 active alive 0
1
2310 pci@1c/pci@1/lpfc@4 c3t21d0s0 SP A1 active alive 0
1

Pseudo name=emcpower4a
CLARiiON ID=CK200061101100 [JAZZ]
Logical device ID=6006016014961600625987643E38DB11 [LUN 815]
state=alive; policy=CLAROpt; priority=0; queued-IOs=0
Owner: default=SP B, current=SP B

==============================================================================
---------------- Host --------------- - Stor - -- I/O Path - --
Stats
---
### HW Path I/O Paths Interf. Mode State Q-IOs
Errors

==============================================================================
2310 pci@1c/pci@1/lpfc@4 c3t20d1s0 SP A0 active alive 0
1
2310 pci@1c/pci@1/lpfc@4 c3t21d1s0 SP A1 active alive 0
1



my code

#!/usr/bin/perl -w

use strict;
use warnings;
use List::MoreUtils qw(:all);
no warnings qw /syntax/;



#PRINT SERIAL NUMBER

my @sl;
my $filename;
$filename = "cxout1" ;
open (FILE, "<$filename") or die "Could not open $filename: $!";
while (<FILE>) {
next unless $_ =~ /CK/;
$_ = ~ (/\b(ID)\=(\w+)\s+/i) ;
push(@sl,$2);
}


# PRINT UNIQUE SERIAL NUMBER

my %seen = ();
my @uniq = ();
my $item;
foreach $item (@sl) {
unless ($seen{$item}) {
# if we get here, we have not seen it before
$seen{$item} = 1;
push(@uniq, $item);
}
}


print "\nThe Clarion Array Serial Number is @uniq\n\n";


# PRINT LUN INFORMATION

my @luns;
#my $filename;
$filename = "cxout1" ;
open (FILE, "< $filename" ) or die "Could not open $filename: $!";
while (<FILE>) {
chomp;
# next unless $_ =~ /LUN/;
# $_ =~ /\[(LUN\s+\d+)\]/;
next unless /\[(LUN\s+\d+)\]/;
push(@luns,$1);

}

# PRINT POLICY INFORMATION

my @pol;
#my $filename;
$filename = "cxout1" ;
open (FILE, "< $filename" ) or die "Could not open $filename: $!";
while (<FILE>) {
chomp;
next unless $_ =~ /policy/;
$_ = unpack ("x13 A14", $_);
push(@pol,$_);
}

# PRINT OWNER INFORMATION

my @own;
#my $filename;
$filename = "cxout1" ;
open (FILE, "< $filename" ) or die "Could not open $filename: $!";
while (<FILE>) {
chomp;
next unless $_ =~ (/\b(current)\=\w+/);
$_ = unpack ("x21 A14",$_);
push(@own, $_);
}

#PRINT PSEUDO INFORMATION

my @pseudo;
open (FILE, "< $filename" ) or die "Could not open $filename: $!";
while (<FILE>) {
chomp;
next unless $_ =~ (/\b(Pseudo)/);
$_ = unpack ("x12 A18", $_);
push (@pseudo, $_);
}

#CONSOLIDATE & PRINT

my $result = each_array(@luns, @pol, @own, @pseudo);

print "LUN INFO\t POLICY-TYPE\t\t OWNER\t\t PSEUDO DEVICE\t\t\n";


while ( my ($a, $b, $c, $d) = $result->() )
{

print "$a\t\t $b\t\t $c\t\t $d\t\t\n";
}

The main way to simplify your code is to extract all the data in a simgle
pass
of the file. Even if you want to make several passes it is better to write

seek FILE, 0, 0;

to start reading from the beginning again instead of reopening the file
for each
pass.

My first attempt at your program gave me this.

HTH,

Rob



use strict;
use warnings;

use List::MoreUtils qw(:all);

#PRINT SERIAL NUMBER

my $filename = 'cxout1' ;

my %sl;
my @luns;
my @pol;
my @own;
my @pseudo;

open my $fh, '<', $filename or die "Could not open $filename: $!";

while (<$fh>) {
$sl{$1}++ if /\bID=(CK\w+)/i;
push @luns, $1 if /\[(LUN\s+\d+)\]/;
push @pol, $1 if /\b(policy=\w+);/;
push @own, $1 if /\b(current=[\w+ ]+)/;
push @pseudo, $1 if /\bPseudo name=(\w+)/;
}

# PRINT UNIQUE SERIAL NUMBER
#
my @uniq = keys %sl;
print "\nThe Clarion Array Serial Number is @uniq\n\n";


#CONSOLIDATE & PRINT
#
my $result = each_array(@luns, @pol, @own, @pseudo);

print "LUN INFO\t POLICY-TYPE\t\t OWNER\t\t PSEUDO DEVICE\t\t\n";

while ( my @row = $result->() ) {
printf "%s\t\t %s\t\t %s\t\t %s\t\t\n", @row;
}





Relevant Pages

  • Re: Optimize the script
    ... Pseudo name=emcpower3a ... Logical device ID=600601601496160012288D48703EDB11 [LUN 415] ... no warnings qw /syntax/; ...
    (perl.beginners)
  • Re: Optimize the script
    ... below from a file "cxout1" as below. ... Pseudo name=emcpower3a ... Logical device ID=600601601496160012288D48703EDB11 [LUN 415] ...
    (perl.beginners)
  • Optimize the script
    ... below from a file "cxout1" as below. ... Pseudo name=emcpower3a ... Logical device ID=600601601496160012288D48703EDB11 [LUN 415] ...
    (perl.beginners)