next up previous contents
Next: Renvoyer un tableau depuis Up: Les sous programmes Previous: Les sub

Les modules

Un autre utilisation possible des capacités de Perl à ce niveau et qui a en commun avec les sub la méthode de fonctionnement et la simplification du codage et de la maintenance sont les modules.

Cette fois ci, les sous programmes ne sont plus au sein même du script mais dans dans des fichiers séparés.

Créez dans votre répertoire personnel un sous répertoire nommé modules dans le quel vous placerez vos modules[*].

L'écriture d'un module n'est pas vraiment différente de l'écriture d'un script Perl normal. Il convient par contre de lui donner l'extension .pm plutôt que pl .

#!/usr/bin/perl -w
# ============================================================================
#
#    Description: package Getfileconf
#
#
#   Functions : use this package to get the file configuration
#
#   Attributes : none
#
#
#
# ============================================================================

package Conffilemngt;
use strict;

my $homedir = "/home/nesget";
my $etcdir = "$homedir/etc";
#my $confFileGeneric = "$etcdir/$ARGV[0]";

# ReadFile
# This function takes only one parameter which point out
# a variable in the configuration file
# then returns this variable
# the syntax is "ReadFile conf variable"
# &ReadFile($confFileGeneric);

sub ReadFile
{
    my $line;
    my @GenericArray;
    my $confFile = $_[0];
    my $variable = $_[1];
    if(open(ReadFileIN,"<$confFile"))
    {
        while($line = <ReadFileIN>)
        {
            chomp($line);
            unless($line =~/^\#/)
            {
                unless($line eq "")
                {
                    @GenericArray = split(/\=/,$line);
                    if($GenericArray[0] eq $variable)
                    {
                        close(ReadFileIN);
                        return $GenericArray[1];
                    }
                }
            }
        }
    }
    else
    {
        die("File $confFile doesn't exist $!\n");
    }
    close(ReadFileIN);
}




# DefinePriorityLess and DefinePriorityMore
# DefinePriority takes as argument a test value
# and return the right corresponding priority level.
# The syntax is
# &definePriority($confFile,$valueToTest);

sub DefinePriorityLess
{
    my $confFile = "$etcdir/$_[0]";
    my $reference;
    my $medium;
    my $bad;
    my $testValue = $_[1];
    $reference = &ReadFile($confFile,"reference");
    $medium = &ReadFile($confFile,"medium");
    $bad = &ReadFile($confFile,"bad");
    print("$reference $medium $bad $testValue\n");
    if($testValue == $reference)
    {
        return 0;
    }
    if($testValue < $reference and $testValue >= $medium)
    {
        return 1;
    }
    if($testValue < $medium and $testValue >= $bad)
    {
        return 2;
    }
    else
    {
        return 3;
    }
}

sub DefinePriorityMore
{
    my $confFile = "$etcdir/$_[0]";
    my $reference;
    my $medium;
    my $bad;
    my $testValue = $_[1];
    $reference = &ReadFile($confFile,"reference");
    $medium = &ReadFile($confFile,"medium");
    $bad = &ReadFile($confFile,"bad");
    print("$reference $medium $bad $testValue\n");
    if($testValue == $reference)
    {
        return 0;
    }
    if($testValue > $reference and $testValue <= $medium)
    {
        return 1;
    }
    if($testValue > $medium and $testValue <= $bad)
    {
        return 2;
    }
    else
    {
        return 3;
    }
}


1;

On remarque l'utilisation de la commande package Conffilemngt; et l'ajout de de 1; pour cloturer le module. Hormis cela, tout n'est que du Perl très conventionnel.

Pour utiliser ce module au sein d'un script, il convient de préciser à perl ou il se trouve avec l'option -I et les modules à utiliser. La commande propre au module se fait ensuite comme l'appel à un sub mais avec la forme suivante nom_du_module::fonction .

L'exemple ci dessous utilise le module déjà donné en exemple[*] :

  
#!/usr/bin/perl -I/home/elair/modules

use SqlLaunch;
use Netfunction;
use SystemInfo;
use Conffilemngt;
use Alert;
use Sqlscript;
use strict;


my $ip = "192.168.10.35";
my $loadCpu = SystemInfo::TestLinuxCpu();
my $relCpu = int $loadCpu * 100;
print "Charge CPU $relCpu \n";

my $nbrValue = 96;
my $confFile = "pluton.loadCpu";

my $date = localtime();
my $coeff = 100;
my $name = "loadcpu";
my $type = "int";
my $home = "/home/elair";
my $data = "$home/data/loadcpu";
my $gnuplotCf = "$home/etc/loadcpu.cf";

SqlLaunch::Insert("$type","$name","$date","$ip",$relCpu);

my $loadCpuPriority=Conffilemngt::DefinePriorityMore($confFile,$relCpu);
print "La priorite est de $loadCpuPriority\n";
Alert::Alerte($confFile,$loadCpuPriority);

my @returnTabular = SqlLaunch::SelectxlastType("$type","$name","$ip",$nbrValue);

if(open(OUT,">$data"))
{
    my @date = localtime();
    my $tmp;
    foreach $tmp(@returnTabular)
    {
        my @tmpTabular = split(/\;/,$tmp);
        my @date = split(/\./,$tmpTabular[1]);
        my $realValue = $tmpTabular[0] / $coeff;
        print OUT"$date[0]\t$realValue\t\n";
    }
    close(OUT);
}
else
{
    die("No write possible");
}

system("gnuplot $gnuplotCf");



Stephane TOUGARD
6/20/2001