Thread Variable _ ? (52 answers)
Opened by bianca at 2020-12-25 10:24

haj
 2020-12-29 00:04
#193052 #193052
User since
2015-01-07
540 articles
BenutzerIn

user image
2020-12-28T08:52:06 bianca
2020-12-27T11:29:25 haj
Irgendein Teil in Deinem Code übernagelt die stat-Funktion.
Durch meinen eigenen Code sicher nicht aber durch ein anderes CPAN Modul - was davor läuft - schon eher.
Das vermute ich auch.

2020-12-28T08:52:06 bianca
Heute macht auch CPAN:Image::ExifTool Ärger:
Quote
Bareword "_" not allowed while "strict subs" in use at C:/Strawberry/perl/site/lib/Image/ExifTool.pm line 2422.
BEGIN not safe after errors--compilation aborted at C:/Strawberry/perl/site/lib/Image/ExifTool.pm line 4530.
Kann man das denn nicht feststellen, wenn da was überschrieben wird?
Das fängst Du Dir mit require ein, dass je nach Aufrufreihenfolge der erste Modul, der drankommt, drüberfällt.
Man kann auch feststellen, wenn was überschrieben wird, aber dazu braucht's natürlich schon etwas Gewissheit, ob die Theorie mit stat überhaupt stimmt. Dazu kannst Du einen Kanarienvogel einbauen. CPAN:Variable::Magic musst Du installieren, CPAN:Sub::Util ist im Core:
Code (perl): (dl )
1
2
3
4
5
6
use Sub::Util;
use Variable::Magic qw<wizard cast>;
my $wiz = wizard
    (set  => sub { print "stat ist nun ",
                       Sub::Util::subname(\&CORE::GLOBAL::stat), "\n" });
cast *CORE::GLOBAL::stat,$wiz;

Anstelle des print solltest Du irgendetwas setzen, dessen Ausgabe Du mitbekommst. Wenn nun ein Perl-Modul die eingebaute stat-Funktion mit "normalen Mitteln" redefiniert, dann bekommst Du - vielleicht - raus, in welchem Modul das passiert. Wenn da rauskommt stat ist nun StatSplatter::__ANON__, dann weißt Du, dass im Modul StatSplatter (das ich für meine Tests grade erfunden habe) eine anonyme Funktion eingesetzt wurde. Wenn Du keine Ausgabe bekommst und Dein Programm trotzdem stirbt... ja dann ist entweder die ganze Theorie Humbug oder jemand hat mit anderen Mitteln (XS) die Funktion überschrieben.

2020-12-28T08:52:06 bianca
2020-12-27T11:29:25 haj
In diesem Fall kannst Du Dir behelfen, indem Du use Archive::Zip möglichst früh (und wirklich mit use und nicht mit require) einbindest.
Das scheidet als Lösung eigentlich aus. Das ist nicht nur ein kleines Script sondern mein Intranet mit zig Jobs und zig CPAN Modulen, was alles ineinander greift. Ich sehe die Ursache des Problems bis jetzt auch nicht in require an sich. Oder wird es allgemein als best practice angesehen, Systemkommandos zu überschreiben mit dem Motto "ist kein Problem weil nur begrenzte Wirkung wenn jeder use anstatt require verwendet"?
Das Problem bei require ist, dass es erst zur Laufzeit stattfindet. Dadurch wird die Fehlersuche schwieriger, weil alle möglichen Komponenten irgendwo was rumdoktorn können. Ich vermute, ein Autor eines der der zig Module meinte tatsächlich, da etwas Gutes zu tun und hat nicht ausreichend getestet. Dein Intranet läuft ja anscheinend unter Windows? Hintergrund: stat kann unter Windows systembedingt nicht das gleiche tun wie unter Linux, vielleicht hat da ein Modul schlampig verschlimmbessert.

Wenn Du sonst immer und an jeder Stelle require nutzt, (wozu soll das denn eigentlich gut sein?), dann sollte es ausreichen, require Archive::Zip durch use Archive::Zip zu ersetzen.

2020-12-28T08:52:06 bianca
Wieso kommt denn da eigentlich nicht diese ...sub redefined... Meldung, wenn etwas etwas anderes überschreibt?
Weil stat eine eingebaute Funktion ist. Die kann man auch gar nicht so einfach überschreiben. Wenn Du in einem Modul ein sub stat { ...; } definierst und dann stat aufrufst, wird trotzdem die eingebaute Funktion verwendet.

2020-12-28T08:52:06 bianca
Zwischendurch auch vielen vielen Dank für deine Hilfe, haj!
Und auch allen anderen Mitlesern!
Gern geschehen. Im Lockdown hat man eh' nicht viel anderes zu tun :)

View full thread Variable _ ?