Comment utiliser correctement les variables Globales en perl

Je suis un novice de perl. Je suis en train d'essayer de le comprendre par l'écriture de certains programmes. La portée dans perl est de me donner un moment difficile.

J'ai écrit ce qui suit:

use 5.16.3;
use strict;
use Getopt::Long;

Getopt::Long::Configure(qw(bundling no_getopt_compat));
&ArgParser;
our ($sqluser,$sqlpass);

$sqluser="root";
$sqlpass="mypassword";

sub ArgParser {
    print "Username is ".$sqluser." Password is ".$sqlpass."\n";
    my $crt='';
    my $delete='';
    GetOptions ('create|c=s' => $crt,
        'delete|d=s' => $delete
    );
    if ($crt) {
        &DatabaseExec("create",$crt);   
    } elsif ($delete) {
        &DatabaseExec("delete",$delete);    
    } else {
    print "No options chosen\n";
    }
}

sub DatabaseExec {
    use DBI;
    my $dbname=$_[1];
    print "Username is ".$sqluser." Password is ".$sqlpass."\n";
    my $dbh = DBI->connect("dbi:mysql:", $sqluser,$sqlpass);
    my $comand=$_[0];
    if ($_[0] eq "create") {
        my $db_com="create database ".$dbname;
        print 1 == $dbh->do($db_com) ? "Database created\n":"An error occured while creating database. Maybe it exists?\n";
        #print "Executing: ".$db_com."\n";
    } elsif ($_[0] eq "delete") {
        my $db_com="DROP DATABASE ".$dbname;
        #print "Executing: ".$db_com."\n";
        print 1 == $dbh->do($db_com) ? "Database deleted\n":"An error occured while creating database. Maybe it exists?\n";
    }
}

C'était ma compréhension que notre permettrait de déclarer des variables globales pour l'utilisation du code principal et des sous-routines. Toutefois, cela donne le résultat suivant:

#~/perlscripts/dbtest.pl -c hellos
Use of uninitialized value $sqluser in concatenation (.) or string at /root/perlscripts/dbtest.pl line 20.
Use of uninitialized value $sqlpass in concatenation (.) or string at /root/perlscripts/dbtest.pl line 20.
Username is  Password is
Use of uninitialized value $sqluser in concatenation (.) or string at /root/perlscripts/dbtest.pl line 44.
Use of uninitialized value $sqlpass in concatenation (.) or string at /root/perlscripts/dbtest.pl line 44.
Username is  Password is
DBI connect('','',...) failed: Access denied for user 'root'@'localhost' (using password: NO) at /root/perlscripts/dbtest.pl line 45.
Can't call method "do" on an undefined value at /root/perlscripts/dbtest.pl line 50.

Je ne voudrais pas passer ces arguments pour les sous, mais de les utiliser comme des variables globales. Quelqu'un pourrait-il m'aider à déterminer mon incompréhension de la portée?

Vous exécutez des scripts perl en tant que root sans savoir exactement ce que vous faites? 🙂
Eh bien, oui, mais c'est un VPS sur lequel je ne fais rien d'autre que perl test, et de télécharger des torrents. 🙂
Pourtant, sa petite précaution de sécurité pour créer un nouvel utilisateur avec des privilèges limités.

OriginalL'auteur Joel G Mathew | 2013-04-16