Debugging: Odd number of elements in anonymous hash

Debugging: Odd number of elements in anonymous hash

am 16.03.2007 21:17:11 von frank

Hallo,

in einem handgeschriebenen (nicht von mir) unveröffentlichten Modul gibt
es, seit ich eine kleine Änderung gemacht habe, eine Warnung von Perl.
Ich bin irgendwie völlig hilflos, wie ich dem auf den Grund gehen
sollte. Die Warnung lautet:

Odd number of elements in anonymous hash at /home/frank/src/Packages/texlive-new/texlive-base-2007/debia n/tpm2debcommon.pm line 779.

Die Zeile 779 ist in einer Subroutinendefinition, und zwar im
untenstehenden Code die Zeile mit "or do {":

sub mycopy {
my ($src,$dest) = @_;
&mkpath(dirname($dest));
# system("/bin/cp -a $src $dest 2>/dev/null") == 0
my $cp_cmdline = "/bin/cp -a $src $dest" . ( $opt_debug ? "" : " 2>/dev/null");
do {
system($cp_cmdline) == 0
or do {
print STDERR "$cp_cmdline\n";
die ("missing: $src\n");
};
} unless ($opt_onlyscripts == 1);
}

Meine Änderung war das Einführen des

do {
....
} unless ($opt_onlyscripts == 1);

um bestehenden Code herum. Ich nehme gerne Lösungen entgegen, aber noch
lieber einen Hinweis, wie ich selber draufkomme. Wo ist da überhaupt
ein anonymer Hash?

TIA, Frank

--
(17:00:03) ***joeyh loves that install-info uses $'
(17:00:34) Yoe: what's $' again?
(17:00:49) joeyh: shorthand for make your perl program slow at the
expense of readability

Re: Debugging: Odd number of elements in anonymous hash

am 16.03.2007 22:30:06 von hjp-usenet2

On 2007-03-16 20:17, Frank Küster wrote:
> in einem handgeschriebenen (nicht von mir) unveröffentlichten Modul gibt
> es, seit ich eine kleine Änderung gemacht habe, eine Warnung von Perl.
> Ich bin irgendwie völlig hilflos, wie ich dem auf den Grund gehen
> sollte. Die Warnung lautet:
>
> Odd number of elements in anonymous hash at /home/frank/src/Packages/texlive-new/texlive-base-2007/debia n/tpm2debcommon.pm line 779.
>
> Die Zeile 779 ist in einer Subroutinendefinition, und zwar im
> untenstehenden Code die Zeile mit "or do {":
>
[Codefragment]
>
> um bestehenden Code herum. Ich nehme gerne Lösungen entgegen, aber noch
> lieber einen Hinweis, wie ich selber draufkomme. Wo ist da überhaupt
> ein anonymer Hash?

Gute Frage. Ich bekomme auch Deine Warnung nicht (das Fragment
compiliert nicht, und wenn ich daraus ein Script mache, das sich
compilieren lässt, bekomme ich keine Warnung).

Reduziere Dein Modul auf ein minimales, lauffähiges Script, das die
Warnung produziert. Wahrscheinlich findest Du dabei das Problem, wenn
nicht, haben wir wenigstens etwas, was wir uns ansehen können.

hp


--
_ | Peter J. Holzer | Blaming Perl for the inability of programmers
|_|_) | Sysadmin WSR | to write clearly is like blaming English for
| | | hjp@hjp.at | the circumlocutions of bureaucrats.
__/ | http://www.hjp.at/ | -- Charlton Wilbur in clpm

Re: Debugging: Odd number of elements in anonymous hash

am 17.03.2007 04:14:34 von Frank Seitz

Frank Küster wrote:

> Ich nehme gerne Lösungen entgegen, aber noch
> lieber einen Hinweis, wie ich selber draufkomme.

Versuche, es anders zu formulieren, z.B. mit if.

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: Debugging: Odd number of elements in anonymous hash

am 17.03.2007 12:01:03 von frank

"Peter J. Holzer" wrote:

> Gute Frage. Ich bekomme auch Deine Warnung nicht (das Fragment
> compiliert nicht, und wenn ich daraus ein Script mache, das sich
> compilieren lässt, bekomme ich keine Warnung).
>
> Reduziere Dein Modul auf ein minimales, lauffähiges Script, das die
> Warnung produziert. Wahrscheinlich findest Du dabei das Problem, wenn
> nicht, haben wir wenigstens etwas, was wir uns ansehen können.

Eigentlich bin ich ja ein großer Freund von Minimalbeispielen, aber hier
möchte ich das lieber vermeiden. Das ist ein 700-Zeilen-Modul und ein
500-Zeilen-Skript, voll von our-Variablen, das 3 MByte Daten-Dump und
400 Zeilen Konfigurationsdatei liest. Und das beschriebene Problem trat
gerade auf, während ich versuche, das Monstrum in sinnvoll voneinander
getrennte Häppchen zu zerlegen.

Da versuche ich es lieber zunächst mit Franks Ratschlag.

Gruß, Frank
--
But this:
> For fucks sake...
is just offensive. It should have an apostrophe(!)
[MJ Ray, nowhere]

Re: Debugging: Odd number of elements in anonymous hash

am 17.03.2007 12:41:20 von frank

Frank Seitz wrote:

> Frank Küster wrote:
>
>> Ich nehme gerne Lösungen entgegen, aber noch
>> lieber einen Hinweis, wie ich selber draufkomme.
>
> Versuche, es anders zu formulieren, z.B. mit if.

Stimmt. Mit

@@ -774,13 +774,13 @@
&mkpath(dirname($dest));
# system("/bin/cp -a $src $dest 2>/dev/null") == 0
my $cp_cmdline = "/bin/cp -a $src $dest" . ( $opt_debug ? "" : " 2>/dev/null");
- if ($opt_onlyscripts == 0) {
+ $opt_onlyscripts || {
system($cp_cmdline) == 0
or do {
print STDERR "$cp_cmdline\n";
die ("missing: $src\n");
- };
- };
+ }
+ }
}

Gibt es keine Warnung mehr. Was lerne ich jetzt daraus?

TIA, Frank
--
But this:
> For fucks sake...
is just offensive. It should have an apostrophe(!)
[MJ Ray, nowhere]

Re: Debugging: Odd number of elements in anonymous hash

am 17.03.2007 13:15:44 von Frank Seitz

Frank Küster wrote:

> @@ -774,13 +774,13 @@
> &mkpath(dirname($dest));
> # system("/bin/cp -a $src $dest 2>/dev/null") == 0
> my $cp_cmdline = "/bin/cp -a $src $dest" . ( $opt_debug ? "" : " 2>/dev/null");
> - if ($opt_onlyscripts == 0) {
> + $opt_onlyscripts || {
> system($cp_cmdline) == 0
> or do {
> print STDERR "$cp_cmdline\n";
> die ("missing: $src\n");
> - };
> - };
> + }
> + }
> }
>
> Gibt es keine Warnung mehr. Was lerne ich jetzt daraus?

Tip: Poste vernünftigen Code, wenn Du möchtest, dass man sich
das anguckt.

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: Debugging: Odd number of elements in anonymous hash

am 17.03.2007 13:19:09 von Florian Weimer

* Frank Küster:

> do {
> system($cp_cmdline) == 0
> or do {
> print STDERR "$cp_cmdline\n";
> die ("missing: $src\n");
> };
> } unless ($opt_onlyscripts == 1);

Dein Perl wird das hier wohl als

unless ($opt_onlyscripts == 1) {
my %temp = (system ...);
\%temp;
}

interpretieren, d.h. die geschweiften Klammern werden als
Hash-Referenz-Konstruktor aufgefaßt, der nun einmal eine ungerade Zahl
("odd number") von Elementem spendiert bekommt. Möglicherweise ist das
ein Perl-Bug, aber die Grammatik ist an dieser Stelle schlicht
mehrdeutig.

Re: Debugging: Odd number of elements in anonymous hash

am 17.03.2007 13:39:39 von Frank Seitz

Florian Weimer wrote:
> * Frank Küster:
>>
>> do {
>> system($cp_cmdline) == 0
>> or do {
>> print STDERR "$cp_cmdline\n";
>> die ("missing: $src\n");
>> };
>> } unless ($opt_onlyscripts == 1);
>
> Dein Perl wird das hier wohl als
>
> unless ($opt_onlyscripts == 1) {
> my %temp = (system ...);
> \%temp;
> }
>
> interpretieren, d.h. die geschweiften Klammern werden als
> Hash-Referenz-Konstruktor aufgefaßt, der nun einmal eine ungerade Zahl
> ("odd number") von Elementem spendiert bekommt. Möglicherweise ist das
> ein Perl-Bug, aber die Grammatik ist an dieser Stelle schlicht
> mehrdeutig.

Was genau soll syntaktisch mehrdeutig sein?
Deine Code-Reformulierung finde ich kurios.

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: Debugging: Odd number of elements in anonymous hash

am 17.03.2007 14:23:26 von frank

Florian Weimer wrote:

> * Frank Küster:
>
>> do {
>> system($cp_cmdline) == 0
>> or do {
>> print STDERR "$cp_cmdline\n";
>> die ("missing: $src\n");
>> };
>> } unless ($opt_onlyscripts == 1);
>
> Dein Perl wird das hier wohl als
>
> unless ($opt_onlyscripts == 1) {
> my %temp = (system ...);
> \%temp;
> }
>
> interpretieren, d.h. die geschweiften Klammern werden als
> Hash-Referenz-Konstruktor aufgefaßt,

Hm. Wie sollte man denn einen mehrzeiligen Block sonst schreiben, der
nur unter einer Bedingung ausgeführt werden soll, *wenn* man die
Bedingung erst hinten haben will?

#!/usr/bin/perl

use strict;
use warnings;

my $bedingung = 0;
# my $bedingung = 1;

do {
print "Hier bin ich.\n";
print "nochwas\n";
} unless ($bedingung);

Ohne do (also nur "{ ...} unless ($bedingung):") geht es syntaktisch
nicht. Mit vorgezogener Bedingung (ich habe dann ja auch unless zum if
gemacht) geht es und meine Warnung war auch weg. Aber in dem Fall ist
es halt so, dass die Funktion "mycopy" heisst und eben normalerweise
immer kopieren soll, außer wenn $opt_onlyscripts gesetzt ist - letzlich
eine debug-Option. Nach der Regel "das wesentliche zuerst" wollte ich
das gerne hinten stehen haben.

Gruß, Frank
--
But this:
> For fucks sake...
is just offensive. It should have an apostrophe(!)
[MJ Ray, nowhere]

Re: Debugging: Odd number of elements in anonymous hash

am 17.03.2007 15:15:53 von Florian Weimer

* Frank Seitz:

>> interpretieren, d.h. die geschweiften Klammern werden als
>> Hash-Referenz-Konstruktor aufgefaßt, der nun einmal eine ungerade Zahl
>> ("odd number") von Elementem spendiert bekommt. Möglicherweise ist das
>> ein Perl-Bug, aber die Grammatik ist an dieser Stelle schlicht
>> mehrdeutig.
>
> Was genau soll syntaktisch mehrdeutig sein?

{ ... } wird u.a. für Hash-Konstruktoren, anonyme Unterprogramme und
Blöcke genutzt. Ein bißchen beschrieben ist das in perlref
beschrieben.

Re: Debugging: Odd number of elements in anonymous hash

am 17.03.2007 15:25:39 von Florian Weimer

* Frank Küster:

> Hm. Wie sollte man denn einen mehrzeiligen Block sonst schreiben, der
> nur unter einer Bedingung ausgeführt werden soll, *wenn* man die
> Bedingung erst hinten haben will?

Es scheint ja bei einigen Perls zu gehen, möglicherweise ist das ein
versionsabhängiger Bug.

> do {
> print "Hier bin ich.\n";
> print "nochwas\n";
> } unless ($bedingung);

perlref sagt, daß man ein Semikolon zum Vereindeutigen nehmen soll:

do {;
print "Hier bin ich.\n";
print "nochwas\n";
} unless ($bedingung);

Hilft das in Deinem Fall?

Re: Debugging: Odd number of elements in anonymous hash

am 17.03.2007 15:27:27 von Frank Seitz

Florian Weimer wrote:
> * Frank Seitz:
>>
>>Was genau soll syntaktisch mehrdeutig sein?
>
> { ... } wird u.a. für Hash-Konstruktoren, anonyme Unterprogramme und
> Blöcke genutzt.

"do BLOCK" ist eine Anweisung. Dass geschweifte Klammern
in verschiedenen Zusammenhängen benutzt werden, ist klar. Ich
kann das Problem ohnehin nicht nachvollziehen.

> Ein bißchen beschrieben ist das in perlref beschrieben.

Zitat?

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: Debugging: Odd number of elements in anonymous hash

am 17.03.2007 16:45:16 von Florian Weimer

* Frank Seitz:

>> { ... } wird u.a. für Hash-Konstruktoren, anonyme Unterprogramme und
>> Blöcke genutzt.
>
> "do BLOCK" ist eine Anweisung. Dass geschweifte Klammern
> in verschiedenen Zusammenhängen benutzt werden, ist klar. Ich
> kann das Problem ohnehin nicht nachvollziehen.

Es gibt auch ein "do EXPR", und ein Hash-Konstruktor ist ein Ausdruck.

>> Ein bißchen beschrieben ist das in perlref beschrieben.
>
> Zitat?

"Making References", dritter Punkt, "A reference to an anonymous hash
can be created using curly brackets". Der ganze Abschnitt ist etwas
länglich.

Re: Debugging: Odd number of elements in anonymous hash

am 17.03.2007 17:00:49 von Frank Seitz

Florian Weimer wrote:
> * Frank Seitz:
>>
>>"do BLOCK" ist eine Anweisung. Dass geschweifte Klammern
>>in verschiedenen Zusammenhängen benutzt werden, ist klar. Ich
>>kann das Problem ohnehin nicht nachvollziehen.
>
> Es gibt auch ein "do EXPR", und ein Hash-Konstruktor ist ein Ausdruck.

EXPR ist in dem Fall kein beliebiger Ausdruck, sondern einer, der
einen Dateinamen (String) liefert. Ein Hashliteral ist
definitiv kein String.

>>>Ein bißchen beschrieben ist das in perlref beschrieben.
>>
>>Zitat?
>
> "Making References", dritter Punkt, "A reference to an anonymous hash
> can be created using curly brackets". Der ganze Abschnitt ist etwas
> länglich.

Sicher, Mehrdeutigkeiten zwischen BLOCK und Hashliteral gibt es.
Beim do{} sollte das IMO nicht der Fall sein. Das beobachtete
Phänomen war wohl mal ein Bug im Parser.

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: Debugging: Odd number of elements in anonymous hash

am 19.03.2007 12:23:46 von frank

Florian Weimer wrote:

> * Frank Küster:
>
>> Hm. Wie sollte man denn einen mehrzeiligen Block sonst schreiben, der
>> nur unter einer Bedingung ausgeführt werden soll, *wenn* man die
>> Bedingung erst hinten haben will?
>
> Es scheint ja bei einigen Perls zu gehen, möglicherweise ist das ein
> versionsabhängiger Bug.
>
>> do {
>> print "Hier bin ich.\n";
>> print "nochwas\n";
>> } unless ($bedingung);
>
> perlref sagt, daß man ein Semikolon zum Vereindeutigen nehmen soll:
>
> do {;
> print "Hier bin ich.\n";
> print "nochwas\n";
> } unless ($bedingung);
>
> Hilft das in Deinem Fall?

Nein, hilft nicht:

Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
Platform:
osname=linux, osvers=2.6.18.3, archname=i486-linux-gnu-thread-multi
uname='linux saens 2.6.18.3 #1 smp sat nov 25 13:39:52 est 2006 i686 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.8 -Darchlib=/usr/lib/perl/5.8 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.8.8 -Dsitearch=/usr/local/lib/perl/5.8.8 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Uusesfio -Uusenm -Duseshrplib -Dlibperl=libperl.so.5.8.8 -Dd_dosuid -des'
hint=recommended, useposix=true, d_sigaction=define
usethreads=define use5005threads=undef useithreads=define usemultiplicity=define
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=undef use64bitall=undef uselongdouble=undef
usemymalloc=n, bincompat5005=undef
[...]
Built under linux
Compiled at Dec 6 2006 23:05:53

Gruß, Frank

--
But this:
> For fucks sake...
is just offensive. It should have an apostrophe(!)
[MJ Ray, nowhere]

Re: Debugging: Odd number of elements in anonymous hash

am 19.03.2007 13:28:29 von Ferry Bolhar

Florain Weiner:

> Dein Perl wird das hier wohl als
>
> unless ($opt_onlyscripts == 1) {
> my %temp = (system ...);
> \%temp;
> }
>
> interpretieren, d.h. die geschweiften Klammern werden als
> Hash-Referenz-Konstruktor aufgefaßt, der nun einmal eine ungerade Zahl
> ("odd number") von Elementem spendiert bekommt.

Ein Perl, das den Code des OP in der von dir angedeuteten Weise
interpretiert, würde ich nicht mehr verwenden... ;-)

> Möglicherweise ist das
> ein Perl-Bug, aber die Grammatik ist an dieser Stelle schlicht
> mehrdeutig.

Nein. Das ist ein Block-do, da ist nichts Mehrdeutiges dran.

Der einzige Fall, in dem ich bisher eine solche Meldung bekommen
habe, ist folgender:

sub hallo {
my $ref = shift;
&$ref;
}

hallo {print "Hallo!"};

Hier soll der Funktion hallo() eine Codereferenz übergeben werden,
Perl nimmt aber an, dass es sich im eine Hashreferenz (mit nur einem
Element) handelt. Man kann aber durch Prototyping dem Compiler
schnell klarmachen, was man will:

sub hallo(&) { ...

Ich konnte das Problem des OP mit seinem Code nicht nachvoll-
ziehen. Entweder der Code wurde nicht exakt gepostet, oder es ist
wirklich ein interessanter Bug. In diesem Fall wäre die verwendete
Perl-Version (perl -v) interessant.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Debugging: Odd number of elements in anonymous hash

am 19.03.2007 14:56:24 von frank

"Ferry Bolhar" wrote:

> Ich konnte das Problem des OP mit seinem Code nicht nachvoll-
> ziehen. Entweder der Code wurde nicht exakt gepostet, oder es ist
> wirklich ein interessanter Bug. In diesem Fall wäre die verwendete
> Perl-Version (perl -v) interessant.

This is perl, v5.8.8 built for i486-linux-gnu-thread-multi

"perl -V" habe ich auch schon in Teilen gepostet. Wenn jemand sich für
den Perl-Bug interessiert, der Code ist öffentlich und ich erkläre gerne
welche Daten man wie an das Skript verfüttern muss damit es den Bug
zeigt. Aber selber bin ich dadurch zufriedengestellt, dass es mit "if"
klappt und dass es kein Zeichen von absoluter Perl-Ahnungslosigkeit ist,
das Problem nicht zu sehen.

Gruß, Frank
--
But this:
> For fucks sake...
is just offensive. It should have an apostrophe(!)
[MJ Ray, nowhere]

Re: Debugging: Odd number of elements in anonymous hash

am 19.03.2007 19:29:19 von Ferry Bolhar

Frank Küster:

> "perl -V" habe ich auch schon in Teilen gepostet. Wenn jemand sich für
> den Perl-Bug interessiert, der Code ist öffentlich und ich erkläre gerne
> welche Daten man wie an das Skript verfüttern muss damit es den Bug
> zeigt.

Ich würde mich dafür interessieren. Ich möchte dieses Verhalten
gerne nachstellen, um festzustellen, wodurch es hervorgerufen
wird und ob es in Folgeversionen auch noch da ist. Eventuell
könnte man es dann auch an p5p weitergeben.

Bitte also um weitere Informationen.

Schöne Grüße aus Wien,

Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Debugging: Odd number of elements in anonymous hash

am 19.03.2007 20:35:55 von Florian Weimer

* Frank Küster:

>> Hilft das in Deinem Fall?
>
> Nein, hilft nicht:
>
> Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
> Platform:
> osname=linux, osvers=2.6.18.3, archname=i486-linux-gnu-thread-multi
> uname='linux saens 2.6.18.3 #1 smp sat nov 25 13:39:52 est 2006 i686 gnulinux '

Oh, das ist ja unser eigenes Hundefutter.

Wenn das Semikolon nicht hilft, ist IMNSHO ein Bug. 8-( Also Testcase
bauen. Ich konnte das Verhalten leider bei meinen Versuchen nicht
reproduzieren.

Re: Debugging: Odd number of elements in anonymous hash

am 19.03.2007 21:40:53 von hjp-usenet2

On 2007-03-19 11:23, Frank Küster wrote:
> Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
> Platform:
> osname=linux, osvers=2.6.18.3, archname=i486-linux-gnu-thread-multi
> uname='linux saens 2.6.18.3 #1 smp sat nov 25 13:39:52 est 2006 i686 gnulinux '
> config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
> -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr

Moment mal, das passt überhaupt nicht zu Deiner vorigen Beschreibung: Da
hast was von einem "MIPS-Kistel" geschrieben, aber dieses Perl für Intel
x86 gebaut. Du hast geschrieben, dass Du das Paket mit ipkg installiert
hast, aber dieses Perl ist für Debian gebaut, wo ipkg zumindest unüblich
ist. Und -fPIC braucht man üblicherweise für Shared Libraries.

hp


--
_ | Peter J. Holzer | Blaming Perl for the inability of programmers
|_|_) | Sysadmin WSR | to write clearly is like blaming English for
| | | hjp@hjp.at | the circumlocutions of bureaucrats.
__/ | http://www.hjp.at/ | -- Charlton Wilbur in clpm

Re: Debugging: Odd number of elements in anonymous hash

am 19.03.2007 21:51:05 von Florian Weimer

* Frank Seitz:

> Florian Weimer wrote:
>> * Frank Seitz:
>>>
>>>"do BLOCK" ist eine Anweisung. Dass geschweifte Klammern
>>>in verschiedenen Zusammenhängen benutzt werden, ist klar. Ich
>>>kann das Problem ohnehin nicht nachvollziehen.
>>
>> Es gibt auch ein "do EXPR", und ein Hash-Konstruktor ist ein Ausdruck.
>
> EXPR ist in dem Fall kein beliebiger Ausdruck, sondern einer, der
> einen Dateinamen (String) liefert.

Das sieht man aber der Syntax nicht an.

> Ein Hashliteral ist definitiv kein String.

Das hier:

{ foo => 2 } && "foo"

ist ein Ausdruck, der mit einem Hash-Literal beginnt und zu einem
String führt. Nur mal so als Beispiel.

Ich will ja gar nicht leugnen, daß ein Spezialfall in der Grammatik
hier sinnvoll wäre (deswegen auch "Bug"). Aber es ist eben doch nicht
so offensichtlich, wie man das Problem in den Griff bekommt. Aus
perly.y werde ich diesbezüglich auch nicht so recht schlau.

Re: Debugging: Odd number of elements in anonymous hash

am 19.03.2007 21:52:02 von Frank Seitz

Peter J. Holzer wrote:
> On 2007-03-19 11:23, Frank Küster wrote:
>>
>>Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
>> Platform:
>> osname=linux, osvers=2.6.18.3, archname=i486-linux-gnu-thread-multi
>> uname='linux saens 2.6.18.3 #1 smp sat nov 25 13:39:52 est 2006 i686 gnulinux '
>> config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
>> -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr
>
> Moment mal, das passt überhaupt nicht zu Deiner vorigen Beschreibung: Da
> hast was von einem "MIPS-Kistel" geschrieben, aber dieses Perl für Intel
> x86 gebaut. Du hast geschrieben, dass Du das Paket mit ipkg installiert
> hast, aber dieses Perl ist für Debian gebaut, wo ipkg zumindest unüblich
> ist. Und -fPIC braucht man üblicherweise für Shared Libraries.

Du hast im Thread geirrt :)

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: Debugging: Odd number of elements in anonymous hash

am 19.03.2007 22:11:17 von Frank Seitz

Florian Weimer wrote:
> * Frank Seitz:
>>Florian Weimer wrote:
>>>* Frank Seitz:
>>>>
>>>>"do BLOCK" ist eine Anweisung. Dass geschweifte Klammern
>>>>in verschiedenen Zusammenhängen benutzt werden, ist klar. Ich
>>>>kann das Problem ohnehin nicht nachvollziehen.
>>>
>>>Es gibt auch ein "do EXPR", und ein Hash-Konstruktor ist ein Ausdruck.
>>
>>EXPR ist in dem Fall kein beliebiger Ausdruck, sondern einer, der
>>einen Dateinamen (String) liefert.
>
> Das sieht man aber der Syntax nicht an.

Wieso das nicht? Wenn eine geschweifte Klammer folgt,
ist es ein Block. Sonst ist es ein anderer Fall.

>>Ein Hashliteral ist definitiv kein String.
>
> Das hier:
>
> { foo => 2 } && "foo"
>
> ist ein Ausdruck, der mit einem Hash-Literal beginnt und zu einem
> String führt. Nur mal so als Beispiel.

Hier kommt es darauf an, was enger bindet, das do oder das &&.
Ohne es ausprobiert zu haben, würde ich sagen das do.

> Ich will ja gar nicht leugnen, daß ein Spezialfall in der Grammatik
> hier sinnvoll wäre (deswegen auch "Bug"). Aber es ist eben doch nicht
> so offensichtlich, wie man das Problem in den Griff bekommt. Aus
> perly.y werde ich diesbezüglich auch nicht so recht schlau.

Meine Perl-Version verhält sich, wie ich es erwarte, was identisch
ist zu dem, wie ich den Code interpretiere. Ich sehe aufgrund
der Semantik des do keine Mehrdeutigkeit.

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: Debugging: Odd number of elements in anonymous hash

am 19.03.2007 22:28:04 von hjp-usenet2

On 2007-03-19 20:52, Frank Seitz wrote:
> Peter J. Holzer wrote:
[unpassendes]
>
> Du hast im Thread geirrt :)

Äh, stimmt. Ich verzieh mich in eine Ecke und genier mich.

hp


--
_ | Peter J. Holzer | Blaming Perl for the inability of programmers
|_|_) | Sysadmin WSR | to write clearly is like blaming English for
| | | hjp@hjp.at | the circumlocutions of bureaucrats.
__/ | http://www.hjp.at/ | -- Charlton Wilbur in clpm

Re: Debugging: Odd number of elements in anonymous hash

am 19.03.2007 22:46:13 von frank

"Ferry Bolhar" wrote:

> Frank Küster:
>
>> "perl -V" habe ich auch schon in Teilen gepostet. Wenn jemand sich für
>> den Perl-Bug interessiert, der Code ist öffentlich und ich erkläre gerne
>> welche Daten man wie an das Skript verfüttern muss damit es den Bug
>> zeigt.
>
> Ich würde mich dafür interessieren. Ich möchte dieses Verhalten
> gerne nachstellen, um festzustellen, wodurch es hervorgerufen
> wird und ob es in Folgeversionen auch noch da ist. Eventuell
> könnte man es dann auch an p5p weitergeben.
>
> Bitte also um weitere Informationen.

Nachdem Florian auch interessiert ist, machen wir das mal vorerst in der
Gruppe - wenn es zu detailliert wird, können wir ja auf Mail ausweichen.

Am einfachsten und wenn Download-Volumen kein Problem ist macht ihr
folgendes:

(Florian) dget http://people.debian.org/~frank/texlive-base_2007-1~3.dsc

(Ferry) herunterladen von
http://people.debian.org/~frank/texlive-base_2007-1~3.diff.g z
http://people.debian.org/~frank/texlive-base_2007.orig.tar.g z

tar -xzf texlive-base_2007.orig.tar.gz # oder wie immer das unter
# Windows geht
gunzip texlive-base_2007-1~3.diff.gz # oder wie immer...
cd texlive-base-2007
patch -p1 < ../texlive-base_2007-1~3.diff

(beide)

perl debian/tpm2deb-bin.pl --nosource texlive-common

Das sollte ein paar Sekunden dauern, ein paar Meldungen ausgeben und
*keine* "odd number..."-Warnung liefern (am Anfang kommt ein 'Variable
"@SpecialActions" will not stay shared...', aber das soll uns hier nicht
interessieren).

Dann folgenden patch anwenden:

--- debian/tpm2debcommon.pm.orig 2007-03-19 22:39:42.000000000 +0100
+++ debian/tpm2debcommon.pm 2007-03-19 22:40:02.000000000 +0100
@@ -774,7 +774,8 @@
&mkpath(dirname($dest));
# system("/bin/cp -a $src $dest 2>/dev/null") == 0
my $cp_cmdline = "/bin/cp -a $src $dest" . ( $opt_debug ? "" : " 2>/dev/null");
- if ($opt_onlyscripts == 0) {
+# if ($opt_onlyscripts == 0) {
+ $opt_onlyscripts || {
system($cp_cmdline) == 0
or do {
print STDERR "$cp_cmdline\n";

Jetzt gibt die gleiche Kommandozeile die interessierende Warnung:


$ perl debian/tpm2deb-bin.pl --nosource texlive-common
Variable "@SpecialActions" will not stay shared at debian/tpm2deb-bin.pl line 341.
Start loading config file ...
... done
Start loading tpm data ...
... done
Building data hash ...
Checking consistency ...
... tpm files and config file are consistent, good!
Working on texlive-common
Odd number of elements in anonymous hash at /home/frank/src/Packages/texlive-new/texlive-base-2007/debia n/tpm2debcommon.pm line 780.
Making maintainer scripts for texlive-common in ./debian...

Und bitte schlagt mich nicht wegen des coding-Stils in der Datei.
Konstruktive Anregungen nehme ich aber gerne entgegen.

Gruß und vielen Dank für euer Interesse,

Frank
--
But this:
> For fucks sake...
is just offensive. It should have an apostrophe(!)
[MJ Ray, nowhere]

Re: Debugging: Odd number of elements in anonymous hash

am 19.03.2007 22:47:52 von frank

"Peter J. Holzer" wrote:

> On 2007-03-19 11:23, Frank Küster wrote:
>> Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
>> Platform:
>> osname=linux, osvers=2.6.18.3, archname=i486-linux-gnu-thread-multi
>> uname='linux saens 2.6.18.3 #1 smp sat nov 25 13:39:52 est 2006 i686 gnulinux '
>> config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
>> -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr
>
> Moment mal, das passt überhaupt nicht zu Deiner vorigen Beschreibung: Da
> hast was von einem "MIPS-Kistel" geschrieben, aber dieses Perl für Intel
> x86 gebaut.

Du hast dich verirrt!

Gruß, Frank

--
But this:
> For fucks sake...
is just offensive. It should have an apostrophe(!)
[MJ Ray, nowhere]

Re: Debugging: Odd number of elements in anonymous hash

am 20.03.2007 09:10:48 von frank

Frank Küster wrote:

> "Ferry Bolhar" wrote:
>
>> Frank Küster:
>>
>>> "perl -V" habe ich auch schon in Teilen gepostet. Wenn jemand sich für
>>> den Perl-Bug interessiert, der Code ist öffentlich und ich erkläre gerne
>>> welche Daten man wie an das Skript verfüttern muss damit es den Bug
>>> zeigt.
>>
>> Ich würde mich dafür interessieren. Ich möchte dieses Verhalten
>> gerne nachstellen, um festzustellen, wodurch es hervorgerufen
>> wird und ob es in Folgeversionen auch noch da ist. Eventuell
>> könnte man es dann auch an p5p weitergeben.
>>
>> Bitte also um weitere Informationen.
>
> Nachdem Florian auch interessiert ist, machen wir das mal vorerst in der
> Gruppe - wenn es zu detailliert wird, können wir ja auf Mail ausweichen.
>
> Am einfachsten und wenn Download-Volumen kein Problem ist macht ihr
> folgendes:

Ich hätte vielleicht eine Zahl zum Volumen verlieren sollen: 70 MByte.

Wenn einer keine gute Anbindung hat, kann ich versuchen das etwas zu
destillieren.

Gruß, Frank
--
But this:
> For fucks sake...
is just offensive. It should have an apostrophe(!)
[MJ Ray, nowhere]

Re: Debugging: Odd number of elements in anonymous hash

am 20.03.2007 09:48:12 von Ferry Bolhar

Frank Küster:

> Jetzt gibt die gleiche Kommandozeile die interessierende Warnung:

Ich glaube, jetzt ist klar, wo hier das Problem ist:

Im ersten Fall schreibst du

if ($opt_onlyscripts == 0)

Eine if Anweisung setzt zwingend einen folgenden Block voraus.
Der Parser weiß also, dass die dem geklammerten Ausdruck
folgende geschwungene Klammer Teil des if-Blocks sein muss;
es gibt keine Alternative.

Im zweiten Fall schreibst du

$opt_onlyscripts || ...

Das ist Teil eines skalaren _Ausdrucks_. Daher versucht der
Parser das, was nach dem || Operator folgt, ebenfalls im skalaren
Kontext auszuwerten, was bei einem {....} eben eine Hashreferenz
ergibt und nicht - wie erwartet - den Rückgabewert eines Blocks.

Innerhalb der geschwungenen Klammern verwendest du

system($cp_cmdline) == 0

was ebenfalls ein skalares Resultat ergibt - entweder 0 oder 1.
Das Ergebnis des Ausdrucks ist also

$opt_onlyscripts || {1} # bzw. {0}

und daher eine anonyme Hashreferenz mit nur einem Element -
von Perl vollkommen richtig erkannt und zu Recht hinterfragt.

Die Lösung ist, denke ich, naheliegend: man muss dem Parser
klarmachen, dass der Ausdruck nach dem || Operator ein
Block ist, dessen Rückgabewert zur Auswertung des Ausdrucks
verwendet werden soll - durch Einfügen von "do" läßt sich das
schnell bewerkstelligen:

$opt_onlyscripts || do {system($cp_line) == 0 or do {print...};

und schon ist die "Odd number of elements" Meldung ver-
schwunden!

Also doch kein Bug... ;-)

PS: Den Teil, der die "will not stay shared" Meldung ausgibt,
solltest du dir noch genauer ansehen, da passt etwas nicht!

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Debugging: Odd number of elements in anonymous hash

am 20.03.2007 10:45:08 von Frank Seitz

Ferry Bolhar wrote:
> Frank Küster:

[anderer Code]

> Im zweiten Fall schreibst du
>
> $opt_onlyscripts || ...

[eine vermutlich zutreffende Analyse]

> Also doch kein Bug... ;-)

Obiges kam in dem Originalposting nur garnicht vor.

An Frank Küster: Wenn Du etwas Falsches postest, wäre es nett,
wenn Du auf diesen Lapsus hinweisen würdest, vor allem,
wenn andere (Florian Weimer und ich) sich darüber den
Kopf heiß diskutieren.

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: Debugging: Odd number of elements in anonymous hash

am 20.03.2007 18:46:51 von frank

Frank Seitz wrote:

> Ferry Bolhar wrote:
>> Frank Küster:
>
> [anderer Code]
>
>> Im zweiten Fall schreibst du
>>
>> $opt_onlyscripts || ...
>
> [eine vermutlich zutreffende Analyse]
>
>> Also doch kein Bug... ;-)
>
> Obiges kam in dem Originalposting nur garnicht vor.
>
> An Frank Küster: Wenn Du etwas Falsches postest, wäre es nett,
> wenn Du auf diesen Lapsus hinweisen würdest, vor allem,
> wenn andere (Florian Weimer und ich) sich darüber den
> Kopf heiß diskutieren.

Hm, so einfach ist die Sache nicht. Ursprünglich hatte ich sowohl mit
dem Code im ersten Posting, also

do {
system($cp_cmdline) == 0
or do {
print STDERR "$cp_cmdline\n";
die ("missing: $src\n");
};
} unless ($opt_onlyscripts == 1);

als auch mit dem gerade geposteten experimentiert und mit beiden die
Fehlermeldung erhalten. Als ich gestern die "Anleitung" geschrieben
habe, habe ich aus dem Kopf eine der beiden Varianten wiederhergestellt
und die Meldung erhalten, mit "unless" gibt es in diesem Setup aber
keinen.

Nur dass ich mittlerweile einiges an dem Skript verändert habe, und ich
fürchte es ist die Mühe nicht wert, das zu rekonstruieren (die Version
mit Fehlermeldung, wie sie zum Zeitpunkt der Frage war, habe ich nicht
ins SVN committet).

Gruß, Frank
--
But this:
> For fucks sake...
is just offensive. It should have an apostrophe(!)
[MJ Ray, nowhere]

Re: Debugging: Odd number of elements in anonymous hash

am 21.03.2007 10:20:02 von Ferry Bolhar

Frank Küster:

> Hm, so einfach ist die Sache nicht. Ursprünglich hatte ich sowohl mit
> dem Code im ersten Posting, also
>
> do {
> system($cp_cmdline) == 0
> or do {
> print STDERR "$cp_cmdline\n";
> die ("missing: $src\n");
> };
> } unless ($opt_onlyscripts == 1);

Mit diesem Code tritt das von dir beschriebene Verhalten nachweislich
nicht auf.

Wie ich gestern schon geschrieben habe: es ist ein Unterschied,
ob man

$opt_onlyscripts || {system....}

oder

do {system. ...} unless $opt_onlyscripts == 1;

schreibt.

Im ersten Fall hast du einen Ausdruck, der zur Laufzeit ausgewertet
wird; das Ausführen von "system" ist eigentlich nur ein Seiteneffekt.
Perl muss "system" durchführen, um dessen Rückgabewert im
Ausdruck weiter verwenden zu können; alles innerhalb des
Ausdrucks wird daher als Skalarwert interpretiert; ein {...} somit
als anonyme Hashreferenz (auch Referenzen sind skalare Werte).
Wie gezeigt, hilft hier ein vorgesetztes "do", um dem Parser zu
zeigen, dass es sich eigentlich um einen Block handelt.

Im zweiten Fall hingegen handelt es sich um einen Befehl ("do")
mit einer angehängten Bedingung. Hier ist eindeutig, dass {...}
einen Block markiert, da nach "do" nur entweder ein Skalar (der
dann als Dateiname interpretiert wird) oder eben nur ein Block,
keinesfalls aber eine Hashreferenz, folgen kann.

Wenn du noch rekonstruieren kannst, mit welchem Code du
nun wirklich dieses Verhalten erzeugen konntest, wäre ich nach
wie vor daran interessiert.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Debugging: Odd number of elements in anonymous hash

am 01.04.2007 14:08:07 von Florian Weimer

* Frank Seitz:

>>>EXPR ist in dem Fall kein beliebiger Ausdruck, sondern einer, der
>>>einen Dateinamen (String) liefert.
>>
>> Das sieht man aber der Syntax nicht an.
>
> Wieso das nicht? Wenn eine geschweifte Klammer folgt,
> ist es ein Block. Sonst ist es ein anderer Fall.

Es ist üblich (auch bei Perl), den Typ eines Ausdrucks nicht mit der
Grammatik zu beschreiben. Die Grammatik wäre sonst nicht mehr (auch
nur noch annähernd) kontextfrei, und die typischen Parser-Generatoren
fallen auf die Schnautze.

>> Das hier:
>>
>> { foo => 2 } && "foo"
>>
>> ist ein Ausdruck, der mit einem Hash-Literal beginnt und zu einem
>> String führt. Nur mal so als Beispiel.
>
> Hier kommt es darauf an, was enger bindet, das do oder das &&.
> Ohne es ausprobiert zu haben, würde ich sagen das do.

Bei normalen Prozeduraufrufen bindet das "&&" stärker.

Re: Debugging: Odd number of elements in anonymous hash

am 02.04.2007 09:47:29 von Frank Seitz

Florian Weimer wrote:
> * Frank Seitz:

>>>>EXPR ist in dem Fall kein beliebiger Ausdruck, sondern einer, der
>>>>einen Dateinamen (String) liefert.
>>>
>>>Das sieht man aber der Syntax nicht an.
>>
>>Wieso das nicht? Wenn eine geschweifte Klammer folgt,
>>ist es ein Block. Sonst ist es ein anderer Fall.
>
> Es ist üblich (auch bei Perl), den Typ eines Ausdrucks nicht mit der
> Grammatik zu beschreiben. Die Grammatik wäre sonst nicht mehr (auch
> nur noch annähernd) kontextfrei, und die typischen Parser-Generatoren
> fallen auf die Schnautze.

Nein, sowas ist völlig normal. In Perl sowieso.

>>>Das hier:
>>>
>>> { foo => 2 } && "foo"
>>>
>>>ist ein Ausdruck, der mit einem Hash-Literal beginnt und zu einem
>>>String führt. Nur mal so als Beispiel.
>>
>>Hier kommt es darauf an, was enger bindet, das do oder das &&.
>>Ohne es ausprobiert zu haben, würde ich sagen das do.
>
> Bei normalen Prozeduraufrufen bindet das "&&" stärker.

Was ist ein normaler Prozeduraufruf?

-----------------------------------------
#!/usr/bin/perl -w

use strict;

sub f (&)
{
shift->();
}

f { print "Hello\n" } && print "world\n";

__END__
Hello
world
-----------------------------------------

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