Font
[thread]5945[/thread]

Fehlermeldung: Frag zu einer Fehlermeldung



<< |< 1 2 >| >> 13 entries, 2 pages
wolfgangk
 2003-12-03 12:49
#74201 #74201
User since
2003-11-03
11 articles
BenutzerIn
[default_avatar]
Hallo,

Mein Script:
--------------
#!/usr/bin/perl -w

use CGI qw(:standard);
use strict;

my $z = '';
my $tmp = '';
my @temp = '';
my @menu ='';

open (FILE, 'menu.txt');
@menu=<FILE>;
close FILE;

for ($z=5;$z>=0;$z--){
$tmp=@menu[$z];
@temp= split /,/, $tmp;
if (substr(@temp[0],0,2)*100 != @temp[0]*1){
print @temp[3]."\n";
}
}


wobei menu.txt:
0100,aaa,bbb,ccc
0101,aaa,bbb,ccc
0102,aaa,bbb,ccc
0200,aaa,bbb,ccc
0200,aaa,bbb,ccc
0202,aaa,bbb,ccc

bringt folgende Fehlermeldung:
$scalar value @menu[$z] better written as $menu[$z] ...

die Ausgabe print ist korrekt, was hat die Fehlermeldung zu sagen ?
esskar
 2003-12-03 12:59
#74202 #74202
User since
2003-08-04
7321 articles
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
for ($z=5;$z>=0;$z--)
{
 $tmp=$menu[$z];
  @temp= split /,/, $tmp;
  if (substr($temp[0],0,2)*100 != $temp[0]*1){
  print $temp[3]."\n";
 }
}
\n\n

<!--EDIT|esskar|1070449166-->
Relais
 2003-12-03 13:02
#74203 #74203
User since
2003-08-06
2239 articles
ModeratorIn
[Homepage] [default_avatar]
@ steht für viele, wie in einem Array. An besagter Stelle willst Du aber nur eines, nämlich den Wert, der in @menu an der Stelle $z steht. Da es nur ein Wert ist, und nicht viele, ist das Vorzeichen $ und nicht @.

Schreibe $menu[$z] und die Warnung geht weg. Warum es auch flasch geschrieben funktioniert? Perl macht das beste draus ;)

Und um zukünftige Fehler zu vermeiden, schreibe hinter jedes open ( ... ) auch noch ein or die qq(Konnte "..." nicht öffnen, denn $!) - das zahlt sich aus ;)
Erst denken, dann posten -- Frankfurt.pm-Treffen am Dienstag 07.01.2020 im Café Diesseits
22. Deutscher Perl-Workshop 04. bis 06.03.2020 in Erlangen.
Frankfurt Perl-Workshop 2020-1 ca. Mai-Juni 2020 im Haus der Jugend

Winter is Coming
ptk
 2003-12-03 14:00
#74204 #74204
User since
2003-11-28
3645 articles
ModeratorIn
[default_avatar]
[quote=Relais,03.Dec..2003, 12:02]@ steht für viele, wie in einem Array. An besagter Stelle willst Du aber nur eines, nämlich den Wert, der in @menu an der Stelle $z steht. Da es nur ein Wert ist, und nicht viele, ist das Vorzeichen $ und nicht @.

Schreibe $menu[$z] und die Warnung geht weg. Warum es auch flasch geschrieben funktioniert? Perl macht das beste draus ;)
[/quote]
Genau genommen ist die Schreibweise absolut korrekt --- es ist einfach ein Zugriff auf ein Array-Slice mit genau einem Element. @array[0,1] is erlaubt, warum also nicht auch @array[0]?
Crian
 2003-12-03 14:08
#74205 #74205
User since
2003-08-04
5854 articles
ModeratorIn
[Homepage]
user image
Ja. Und in Perl 6 wird man es wohl wieder so schreiben müssen (mit @ statt $).
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
format_c
 2003-12-03 14:10
#74206 #74206
User since
2003-08-04
1706 articles
HausmeisterIn
[Homepage] [default_avatar]
[quote=Crian,03.12.2003, 13:08]Ja. Und in Perl 6 wird man es wohl wieder so schreiben müssen (mit @ statt $).[/quote]
Uahaha *schüttel*.

Gruß Alex
pq
 2003-12-03 15:02
#74207 #74207
User since
2003-08-04
12204 articles
Admin1
[Homepage]
user image
[quote=wolfgangk,03.12.2003, 11:49]Mein Script:
[/quote]
bitte folgendes lesen: http://wiki.perl-community.de/bin....Beitrag
Quote
bringt folgende Fehlermeldung:
$scalar value @menu[$z] better written as $menu[$z] ...
die Ausgabe print ist korrekt, was hat die Fehlermeldung zu sagen ?

übersetzt heisst es "Skalarer Wert @menu[$z] sollte besser als $menu[$z]
geschrieben werden."
hier gibt's noch 'ne wiki-seite für dich:
http://wiki.perl-community.de/bin/view/Perldoc/perlintro
deine obige schreibweise lernt man eigentlich nur aus schlechten büchern
oder skripten, die man irgendwo gefunden hat =)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Strat
 2003-12-03 15:46
#74208 #74208
User since
2003-08-04
5246 articles
ModeratorIn
[Homepage] [default_avatar]
@array[1] ist auch in perl5 durchaus ok, wenn man dieses eine Element in einen Listenkontext bringen will. @array[1] verhaelt sich zwar haeufig genauso wie $array[1], aber bei manchen Funktionen gibt es da schon Unterschiede, weil sie unterschiedlich darauf reagieren, wenn da was im Listenkontext steht oder im skalarem Kontext.
Code: (dl )
1
2
open (FH, ....) or ...
$liste[0] = <FH>; # skalarer kontext

Code: (dl )
1
2
open (FH, ....) or ...
@liste[0] = <FH>; # listenkontext

<..> verhaelt sich naemlich, je nach Kontext, unterschiedlich. Im skalaren Kontext (Beispiel 1) gibt es eine Zeile zurueck, im Listenkontext (Beispiel 2) gibt es eine Liste aller gelesenen Zeilen zurueck, die erste Zeile wird $liste[0] zugewiesen. So, wo ist jetzt der Unterschied? Im Beispiel 1 kann man von <FH> noch die weiteren Zeilen lesen, im Beispiel 2 sind die jedoch weg (weil sie durch den Listenkontext schon gelesen wurden).
Achtung auch vor:
Code: (dl )
1
2
open (FH, ....) or ...
my ($var) = <FH>; # listenkontext

warnings (oder -w) vermuten jedoch, dass man sich da vertippt hat (ist wohl auch in 95% der Faelle so) und geben deshalb diese Warnung aus.

In Perl5 steht immer das Zeichen davor, was da zurückgegeben werden soll (also $ bei einem skalaren Wert, @ bei einer Liste und % bei einem Hash). Bei Perl6 aendert sich dieses Verhalten; da wird immer das Zeichen geschrieben, was die Variable beinhaltet (man kann sich denken, das @ oder % gehoert fix zum Variablennamen und aendert sich von daher nie). Meiner Meinung nach ist das perl6-verhalten intuitiver (beim jetzigen Verhalten haben naemlich viele Anfaenger Probleme), wenngleich es fuer die Leute, die dieses Verhalten kapiert haben, doch eine kleine Umstellung sein wird\n\n

<!--EDIT|Strat|1070459402-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Relais
 2003-12-03 15:48
#74209 #74209
User since
2003-08-06
2239 articles
ModeratorIn
[Homepage] [default_avatar]
[quote=ptk,03.12.2003, 13:00]Genau genommen ist die Schreibweise absolut korrekt --- es ist einfach ein Zugriff auf ein Array-Slice mit genau einem Element. @array[0,1] is erlaubt, warum also nicht auch @array[0]?[/quote]
Nein, sie ist nicht korrekt, denn ein Array-Slice kommt im Listenkontext zurück, ein Array-Element im Skalaren kontext. Wenn man also ein Array-Slice mit nur einem Element skalar evaluiert, so wäre das Ergebnis eigentlich immer 1 - die Anzahl der Elemente des Array-Slice. Perl ist so schlau es nicht so wörtlich zu nehmen, eine Warnung und das vermutet richtige Ergebnis zu präsentieren.

Und ja klar ist es erlaubt! Perl erlaubt Dir alles, auch in den eigenen Fuß zu schießen...
Erst denken, dann posten -- Frankfurt.pm-Treffen am Dienstag 07.01.2020 im Café Diesseits
22. Deutscher Perl-Workshop 04. bis 06.03.2020 in Erlangen.
Frankfurt Perl-Workshop 2020-1 ca. Mai-Juni 2020 im Haus der Jugend

Winter is Coming
Relais
 2003-12-03 15:50
#74210 #74210
User since
2003-08-06
2239 articles
ModeratorIn
[Homepage] [default_avatar]
[quote=format_c,03.12.2003, 13:10][quote=Crian,03.12.2003, 13:08]Ja. Und in Perl 6 wird man es wohl wieder so schreiben müssen (mit @ statt $).[/quote]
Uahaha *schüttel*.[/quote]
Aber das ist dann so definiert und dokumentiert.
Erst denken, dann posten -- Frankfurt.pm-Treffen am Dienstag 07.01.2020 im Café Diesseits
22. Deutscher Perl-Workshop 04. bis 06.03.2020 in Erlangen.
Frankfurt Perl-Workshop 2020-1 ca. Mai-Juni 2020 im Haus der Jugend

Winter is Coming
<< |< 1 2 >| >> 13 entries, 2 pages



View all threads created 2003-12-03 12:49.