Lex. Variablen "used only once"?
Lex. Variablen "used only once"?
am 14.12.2006 13:43:26 von Ferry Bolhar
Hallo,
bei globalen Variablen warnt Perl bekanntlich, wenn sie nur
einmal im Programm vorkommen (außer sie wurden mit "our"
deklariert).
Bei lexikalischen Variablen, die immer deklariert werden
müssen, warnt Perl - vermutlich wegen der Deklaration - nicht.
Ich hatte das "Glück", ein Perlskript zu erben, dass ziemlich
groß (mehr als 1000 Zeilen Code) ist und wo an allen möglichen
Stellen mit "my" alle möglichen Variablen deklariert wurden.
Das Programm wurde von den verschiedensten Leuten immer
wieder erweitert und umgebaut, und so sieht es auch aus.
Ich könnte es natürlich lassen wie es ist, aber das widerstrebt
meinem Ordnungssinn. Daher meine Frage, ob es irgendeine
Möglichkeit (außer den Code händisch durchzuwassern) gibt,
sich alle deklarierten, aber sonst nicht benutzten lexikalischen
Variablen ausgeben zu lassen.
Danke für alle Infos & LG,
Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Lex. Variablen "used only once"?
am 14.12.2006 14:37:58 von Frank Seitz
Ferry Bolhar wrote:
> Daher meine Frage, ob es irgendeine
> Möglichkeit (außer den Code händisch durchzuwassern) gibt,
> sich alle deklarierten, aber sonst nicht benutzten lexikalischen
> Variablen ausgeben zu lassen.
Das habe ich mich auch schon öfter gefragt, bin
dem aber noch nicht nachgegangen.
Kleine CPAN-Suche:
http://search.cpan.org/search?query=unused+variables&mode=al l
Der erste Eintrag vielleicht?
Wenn Du es Dir anschauen solltest, lass mal hören, ob's was ist.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Lex. Variablen "used only once"?
am 15.12.2006 09:20:39 von Ferry Bolhar
Frank Seitz:
> Kleine CPAN-Suche:
> http://search.cpan.org/search?query=unused+variables&mode=al l
> Der erste Eintrag vielleicht?
>
> Wenn Du es Dir anschauen solltest, lass mal hören, ob's was ist.
Ich habe mir es angesehen, aber es scheint - zumindest bei mir -
nicht zu funktionieren. Ich habe folgendes Skript:
use warnings;
use strict;
use Devel::GC::Helper;
my $x = 2;
our $y = 3;
$main::z = 4;
my $leaks = Devel::GC::Helper::sweep; # Lt. Doku
foreach my $leak (@$leaks) { # Detto
print "Leaked: $leak\n";
}
Abgesehen von der Meldung:
$main::z used only once, possible typo at test.pl line 7.
kommt nichts, d.h., die von der sweep() Funktion zurückgegebene
Referenz zeigt auf ein leeres Arrays. Tja.
Ich habe an den Autor geschrieben, mal sehen, ob ich was höre.
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Lex. Variablen "used only once"?
am 15.12.2006 18:04:45 von Ingo Menger
Ferry Bolhar schrieb:
> Ich könnte es natürlich lassen wie es ist, aber das widerstrebt
> meinem Ordnungssinn. Daher meine Frage, ob es irgendeine
> Möglichkeit (außer den Code händisch durchzuwassern) gibt,
> sich alle deklarierten, aber sonst nicht benutzten lexikalischen
> Variablen ausgeben zu lassen.
Ich glaube, es wird Zeit, daß Du ein eigenes B::Modul schreibst.
Das scheint ein ideales Betätigungsfeld zu sein.
perl -MO=3DFerrysLexXref -c script.pl
Re: Lex. Variablen "used only once"?
am 15.12.2006 18:16:21 von Ingo Menger
Ferry Bolhar schrieb:
> Ich könnte es natürlich lassen wie es ist, aber das widerstrebt
> meinem Ordnungssinn. Daher meine Frage, ob es irgendeine
> Möglichkeit (außer den Code händisch durchzuwassern) gibt,
> sich alle deklarierten, aber sonst nicht benutzten lexikalischen
> Variablen ausgeben zu lassen.
Ich glaube, es wird Zeit, daß Du ein eigenes B::Modul schreibst.
Das scheint ein ideales Betätigungsfeld zu sein.
perl -MO=3DFerrysLexXref -c script.pl
Re: Lex. Variablen "used only once"?
am 18.12.2006 09:04:55 von Ferry Bolhar
Ingo Menger:
>> Ich könnte es natürlich lassen wie es ist, aber das widerstrebt
>> meinem Ordnungssinn. Daher meine Frage, ob es irgendeine
>> Möglichkeit (außer den Code händisch durchzuwassern) gibt,
>> sich alle deklarierten, aber sonst nicht benutzten lexikalischen
>> Variablen ausgeben zu lassen.
>
> Ich glaube, es wird Zeit, daß Du ein eigenes B::Modul schreibst.
> Das scheint ein ideales Betätigungsfeld zu sein.
Da hast du recht, das Problem ist nur, dass ich nicht genau weiß,
wie. Es scheint zwei Ansätze zu geben:
1) Die fragliche Datei Zeile für Zeile einzulesen, zu parsen und
festzustellen, wann welche lex. Variable in einem Scope vorkommt.
Am Ende werden dann alle im Scope definierten, aber nicht
verwendeten Variablen ausgegeben. Klingt einfach, ist es aber
nicht - Perl zu parsen und die unendlichen vielen Möglichkeiten,
in denen ein "my" oder "our" vorkommen kann, zu berücksichtigen,
dürfte alles andere als einfach sein.
Das wäre doch mal was für Regex-Spezialisten: "Schreibe eine
Regex, die jede mögliche Deklaration einer lexikalischen Variable
(oder einer globalen mit our) findet!"
2) Wie du schon geschrieben hast, mit Hilfe von B:: den Weg der
"Verinnerlichung" zu gehen, d.h., die Datenstrukturen des kompi-
lierten Programmes zu erforschen. Das ist vermutlich machbar,
scheitert aber daran, dass ich nicht genau weiß, wonach ich hier
Ausschau halten müsste. In den Padlists, in denen lex. Variablen
abgelegt sind, gibt es keinerlei Hinweise darauf, ob und wie oft
sie verwendet werden (also das, was bei globalen Variablen
der Referenzzähler des zugehörigen Typeglobs ist). Wahrschein-
lich müsste man den Op-Tree nach "pad[s/a/h]v" und
[a/h]elem[fast] OPs durchgehen. Das ist aber erst der erste
Schritt; denn in einem Scope kann auch auf lexikalische Variable,
die in äußeren Scopes deklariert wurden, zugegriffen werden.
Auch das scheint mir also nicht trivial lösbar zu sein; abgesehen
davon, dass ich mich da erst in B:: einarbeiten müsste, von dem
ich bisher nur rudimentär weiß, worum es sich handelt und wie
es funktioniert.
> perl -MO=FerrysLexXref -c script.pl
Schaut super aus, wird aber wohl noch eine Weile auf sich
warten lassen... ;-)
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Lex. Variablen "used only once"?
am 18.12.2006 10:24:56 von Ferry Bolhar
Frank Seitz:
> Kleine CPAN-Suche:
> http://search.cpan.org/search?query=unused+variables&mode=al l
> Der erste Eintrag vielleicht?
>
> Wenn Du es Dir anschauen solltest, lass mal hören, ob's was ist.
Ich habe es mir angesehen und auch mit dem Autor korrespondiert -
die verwendete Kurzbeschreibung des Moduls ist leider ziemlich
mißverständlich: es dient zum Auffinden von "Memory Leaks", daher
von Werten, die z.B. durch kreuzende Referenzen einander gegen-
seitig sperren:
{
my $x = 1;
my $y = \$x;
$x = \$y;
}
Nach dem Verlassen des Blocks werden die Werte von $x und $y
nicht freigegeben, da dies die Referenzen darauf unmöglich machen
(um $x freizugeben, müsste zuerst $y gelöscht werden, was aber
wegen der Referenz von $x darauf nicht möglich ist). Daher bleiben
beide Werte im Speicher erhalten => Memory Leak. Das Modul
erkennt solche Leaks und gibt sie - übrigens nicht besonders
sprechend - aus.
Geht also an meiner Aufgabenstellung leider völlig vorbei.
PS: Ich habe dem Modulautor nahegelegt, die Kurzbescrhreibung
des Moduls entsprechend zu ändern, aber darauf keine Antwort
mehr bekommen...
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Lex. Variablen "used only once"?
am 18.12.2006 10:43:11 von Ingo Menger
Ferry Bolhar schrieb:
> Ingo Menger:
> > Ich glaube, es wird Zeit, daß Du ein eigenes B::Modul schreibst.
> > Das scheint ein ideales Betätigungsfeld zu sein.
> 1) Die fragliche Datei Zeile für Zeile einzulesen, zu parsen und
> festzustellen, wann welche lex. Variable in einem Scope vorkommt.
Vergiß es. "Only perl can parse Perl."
> 2) Wie du schon geschrieben hast, mit Hilfe von B:: den Weg der
> "Verinnerlichung" zu gehen, d.h., die Datenstrukturen des kompi-
> lierten Programmes zu erforschen. Das ist vermutlich machbar,
> scheitert aber daran, dass ich nicht genau weiß, wonach ich hier
> Ausschau halten müsste.
Das dürfte sogar ganz leicht sein. Nimm Dir B::Deparse, B::Xref oder
ähnliche als Beispiel. Im Prinzip läuft es auf einen Tree-Walk
hinaus, wobei Du nur die pad?v-Operationen rausfiltern und entsprechend
auswerten mußt.
> In den Padlists, in denen lex. Variablen
> abgelegt sind, gibt es keinerlei Hinweise darauf, ob und wie oft
> sie verwendet werden (also das, was bei globalen Variablen
> der Referenzzähler des zugehörigen Typeglobs ist). Wahrschein-
> lich müsste man den Op-Tree nach "pad[s/a/h]v" und
> [a/h]elem[fast] OPs durchgehen.
Genau.
> Das ist aber erst der erste
> Schritt; denn in einem Scope kann auch auf lexikalische Variable,
> die in äußeren Scopes deklariert wurden, zugegriffen werden.
Das sollte sich schon rausfinden lassen. Du kannst ja mit anderen
B::Modulen jederzeit sehen, welcher Code für sowas generiert wird.
> Auch das scheint mir also nicht trivial lösbar zu sein; abgesehen
> davon, dass ich mich da erst in B:: einarbeiten müsste, von dem
> ich bisher nur rudimentär weiß, worum es sich handelt und wie
> es funktioniert.
Es ist wirklich nicht schwer. Ich hab mal ein Programm geschrieben, das
den B::Baum durchläuft und daraus (also aus compiliertem Perl-Code)
XS-Files erzeugt, die "dasselbe" machen wie das compilierte
Perl-Programm. Das hat sogar funktioniert, allerdings waren die
erzielten Performancegewinne dann doch nicht so arg, wie ich anfangs
gedacht hatte.
> > perl -MO=3DFerrysLexXref -c script.pl
>
> Schaut super aus, wird aber wohl noch eine Weile auf sich
> warten lassen... ;-)
Wie gesagt, in einer stillen Stunde mal die vorhandenen B:: Sourcen
anschauen, Du wirst überrascht sein, wie wenig Code z.B. B::Xref o.ä.
ist.
Re: Lex. Variablen "used only once"?
am 22.12.2006 01:53:17 von Fred Hare
Ferry Bolhar wrote:
Ferry,
Ich verwende zum "Zählen" der $var seit vielen Jahren ein Script von
Mohsin Ahmed, mosh@cs.albany.edu, 1995.
Ich nenne es Variables-Statistics.pl, der original name war pindex.pl
Falls Du daran interessiert bist und es nicht selbst via Google findest
kann ich das Script aufladen und Dir in dieser NG die URL mitteilen.
--
Fred Hare
Re: Lex. Variablen "used only once"?
am 29.12.2006 11:47:07 von Ferry Bolhar
Ingo Menger:
> Es ist wirklich nicht schwer. Ich hab mal ein Programm geschrieben, das
> den B::Baum durchläuft und daraus (also aus compiliertem Perl-Code)
> XS-Files erzeugt, die "dasselbe" machen wie das compilierte
> Perl-Programm. Das hat sogar funktioniert, allerdings waren die
> erzielten Performancegewinne dann doch nicht so arg, wie ich anfangs
> gedacht hatte.
Könntest du mir das zukommen lassen?
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Lex. Variablen "used only once"?
am 30.12.2006 06:42:05 von Fred Hare
Ferry Bolhar wrote:
> Ingo Menger:
>
>> Es ist wirklich nicht schwer. Ich hab mal ein Programm geschrieben, das
>> den B::Baum durchläuft und daraus (also aus compiliertem Perl-Code)
>> XS-Files erzeugt, die "dasselbe" machen wie das compilierte
>> Perl-Programm. Das hat sogar funktioniert, allerdings waren die
>> erzielten Performancegewinne dann doch nicht so arg, wie ich anfangs
>> gedacht hatte.
>
> Könntest du mir das zukommen lassen?
>
> LG, Ferry
>
OK, ging heute Abend als Email-Beilage an Dich ab.
Fred
--
When you use my email address,
add the word "Trustme" anywhere in the subject-line.
Otherwise the spam-filter will delete the message on the server
Re: Lex. Variablen "used only once"?
am 30.12.2006 15:18:20 von Ingo Menger
Ferry Bolhar schrieb:
> Ingo Menger:
>
> > Es ist wirklich nicht schwer. Ich hab mal ein Programm geschrieben, das
> > den B::Baum durchläuft und daraus (also aus compiliertem Perl-Code)
> > XS-Files erzeugt, die "dasselbe" machen wie das compilierte
> > Perl-Programm. Das hat sogar funktioniert, allerdings waren die
> > erzielten Performancegewinne dann doch nicht so arg, wie ich anfangs
> > gedacht hatte.
>
> Könntest du mir das zukommen lassen?
Tut mir leid: ich stelle gerade fest, daß es mit meiner aktuellen perl
Version nicht mehr funktioniert.
Dokumentiert ist auch nichts.
Sonst gerne.
(So eine Blamage ... ich hätte es besser nicht erwähnt, vergiß es
einfach)
Re: Lex. Variablen "used only once"?
am 02.01.2007 11:16:50 von Ferry Bolhar
Ingo Menger:
>> Könntest du mir das zukommen lassen?
>
> Tut mir leid: ich stelle gerade fest, daß es mit meiner aktuellen perl
> Version nicht mehr funktioniert.
Naja, vielleicht wären nur geringfügige Änderungen notwendig.
Meinen für 5.002 entwickelten XS-Code musste ich für den
Einsatz unter 5.005 und Folgeversionen auch anpassen. War
aber nichts Tragisches; in den Release Notes ist meistens recht
gut dokumentiert, ob und welche Änderungen an XS-Code
notwending werden.
> Dokumentiert ist auch nichts.
Bin ich gewohnt... ;-))
> Sonst gerne.
> (So eine Blamage ... ich hätte es besser nicht erwähnt, vergiß es
> einfach)
Ist natürlich deine Entscheidung, aber ich würde mich auch über
nicht-funktionierenden Code freuen (solange ich weiß, dass er
nicht funktioniert, ist es OK) - einfach als Anregung. Vielleicht
überlegst du es dir ja noch...
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Lex. Variablen "used only once"?
am 02.01.2007 17:08:21 von Ingo Menger
Ferry Bolhar schrieb:
> Ingo Menger:
>
> >> Könntest du mir das zukommen lassen?
> >
> > Tut mir leid: ich stelle gerade fest, daß es mit meiner aktuellen perl
> > Version nicht mehr funktioniert.
>
> Naja, vielleicht wären nur geringfügige Änderungen notwendig.
Sicher, es geht um irgendwelche Linker-Symbole.
> Meinen für 5.002 entwickelten XS-Code musste ich für den
> Einsatz unter 5.005 und Folgeversionen auch anpassen. War
> aber nichts Tragisches; in den Release Notes ist meistens recht
> gut dokumentiert, ob und welche Änderungen an XS-Code
> notwending werden.
Noja, wanns't Dir die Mühe moachen wüllst (das ist das beste
Wienerisch, das ich schriftlich hinkriege, und wahrscheinlich ganz
falsch.)
> > Dokumentiert ist auch nichts.
>
> Bin ich gewohnt... ;-))
Ich hab am Samstag tatsächlich eine Stunde vergeigt, in der ich
versucht habe zu verstehen, ... keine Chance, was aber auch zum Gutteil
an den vergessenen Perl/XSUB-Interna liegt.
> > Sonst gerne.
> > (So eine Blamage ... ich hätte es besser nicht erwähnt, vergiß es
> > einfach)
>
> Ist natürlich deine Entscheidung, aber ich würde mich auch über
> nicht-funktionierenden Code freuen (solange ich weiß, dass er
> nicht funktioniert, ist es OK) - einfach als Anregung. Vielleicht
> überlegst du es dir ja noch...
Ist gut, ich schick es Dir bei Gelegenheit. Komme aber frühestens
nächste Woche dazu.
Re: Lex. Variablen "used only once"?
am 03.01.2007 23:46:02 von Slaven Rezic
"Ingo Menger" writes:
> Ferry Bolhar schrieb:
>
> > Ingo Menger:
> >
> > >> Könntest du mir das zukommen lassen?
> > >
> > > Tut mir leid: ich stelle gerade fest, daß es mit meiner aktuellen perl
> > > Version nicht mehr funktioniert.
> >
> > Naja, vielleicht wären nur geringfügige Änderungen notwendig.
>
> Sicher, es geht um irgendwelche Linker-Symbole.
>
> > Meinen für 5.002 entwickelten XS-Code musste ich für den
> > Einsatz unter 5.005 und Folgeversionen auch anpassen. War
> > aber nichts Tragisches; in den Release Notes ist meistens recht
> > gut dokumentiert, ob und welche Änderungen an XS-Code
> > notwending werden.
>
> Noja, wanns't Dir die Mühe moachen wüllst (das ist das beste
> Wienerisch, das ich schriftlich hinkriege, und wahrscheinlich ganz
> falsch.)
>
>
> > > Dokumentiert ist auch nichts.
> >
> > Bin ich gewohnt... ;-))
>
> Ich hab am Samstag tatsächlich eine Stunde vergeigt, in der ich
> versucht habe zu verstehen, ... keine Chance, was aber auch zum Gutteil
> an den vergessenen Perl/XSUB-Interna liegt.
>
>
> > > Sonst gerne.
> > > (So eine Blamage ... ich hätte es besser nicht erwähnt, vergiß es
> > > einfach)
> >
> > Ist natürlich deine Entscheidung, aber ich würde mich auch über
> > nicht-funktionierenden Code freuen (solange ich weiß, dass er
> > nicht funktioniert, ist es OK) - einfach als Anregung. Vielleicht
> > überlegst du es dir ja noch...
>
> Ist gut, ich schick es Dir bei Gelegenheit. Komme aber frühestens
> nächste Woche dazu.
>
Vielleicht hilft ja Devel::PPPort?
--
Slaven Rezic - slaven rezic de
Tk-AppMaster: a perl/Tk module launcher designed for handhelds
http://tk-appmaster.sf.net