• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved][perl] Test, ob Modul vorhanden

Hi!

Gibt es eine Möglichkeit, das so zu schreiben, dass es funktioniert?

if(Time::Local installiert), dann:
use Time::Local;
my $tag_beginn='02.04.2007';
my @tag_beginn=split /\./, $tag_beginn;
my $tage_vor_heute=int((time() - timelocal(0,0,0,$tag_beginn[0],$tag_beginn[1]-1,$tag_beginn[2])) / 86400);

else
my $tag_beginn='2007-04-02';
my $tage_vor_heute=int((time() - `date -d "$tag_beginn" +%s`) / 86400);
 
Sauber geht das meines Wissens nach nur, indem du alle Verzeichnisse in @INC danach absuchst, ob die gewünschte Moduldatei vorhanden ist. Das könnte etwa so aussehen:

Code:
for ( @INC )
{
	if ( -s $_ . '/Time/Local.pm' )
	{
		use Time::Local; 
		last;
	}
}


Viele Grüße
ginka
 
Da Time::Local zum Standardrepoitoire, sollte das kein Problem darstellen ;-)
Und außerdem gibt's ja eine Fehlermeldung mit "use" wenn es nicht da ist - also alles in Ordnung, oder nicht?
 
Und außerdem gibt's ja eine Fehlermeldung mit "use" wenn es nicht da ist

Kann man dann eigentlich mit
Code:
... or die;
arbeiten ?

(In Python gibt's ja
Code:
try:
    print "Hallo"
except:
    print "Couldn't do it"
Praktisch, oder ?)

Gruß
 
Bei "use" nicht ohne eine Fehlermeldung zu produzieren, wobei gleichzeitig das Parsen des Skriptes abgebrochen wird. Perl führt "use" innerhalb eines BEGIN-Blockes, und damit bereits in der Kompilierungsphase aus. Auf diese Art und Weise kann man Einfluß auf die Übersetzung des Rests des Programms nehmen.

Ansonsten kann man in Perl jede Funktion, die im Fehlerfall quasi "false" zurückliefert statt das Kompilieren mit einer Fehlermeldung abzubrechen, mit "die" abfangen.

Viele Grüße
ginka
 
catweasel schrieb:
my $tag_beginn='02.04.2007';
my @tag_beginn=split /\./, $tag_beginn;
my $tage_vor_heute=int((time() - timelocal(0,0,0,$tag_beginn[0],$tag_beginn[1]-1,$tag_beginn[2])) / 86400);
Noch ein kleiner Hinweis: Soweit ich weiß, wird das Jahr 2007 bei timelocal als 107 dargestellt...
 
Years greater than 999 are interpreted as being the actual year, rather than the offset from 1900. Thus, 1964 would indicate the year Martin Luther King won the Nobel prize, not the year 3864.

http://perldoc.perl.org/Time/Local.html
 
Oben