Hi,
ich habe eine Funktion in der myutils ( auf minimal heruntergebaut):
sub switti(){
my ($test) = @_;
switch($test) {
case 1 { }
}
}
sobald ich nun einen parameter hinzufüge, speichert fhem/perl nicht mehr und gibt Fehler aus:
sub switti($){
my ($test) = @_;
switch($test) {
case 1 { }
}
}
Zitatsyntax error at ./FHEM/99_myUtilsHZG.pm line 29, near ") {" syntax error at ./FHEM/99_myUtilsHZG.pm line 31, near "}" syntax error at ./FHEM/99_myUtilsHZG.pm line 48, near "}" Can't use global @_ in "my" at ./FHEM/99_myUtilsHZG.pm line 57, near "= @_" syntax error at ./FHEM/99_myUtilsHZG.pm line 280, near "}" syntax error at ./FHEM/99_myUtilsHZG.pm line 290, near "}" syntax error at ./FHEM/99_myUtilsHZG.pm line 353, near "}" Can't use global @_ in "my" at ./FHEM/99_myUtilsHZG.pm line 357, near "= @_" syntax error at ./FHEM/99_myUtilsHZG.pm line 436, near "}" Can't use global @_ in "my" at ./FHEM/99_myUtilsHZG.pm line 442, near "= @_" ./FHEM/99_myUtilsHZG.pm has too many errors.
Hier sind die ersten Zeilen meiner 99_, aber ich vermute, es sind nur Folgefehler...
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
use Switch;
use IO::Socket::INET;
use List::Util qw(sum);
use Time::Local;
use Scalar::Util qw(looks_like_number);
sub
myUtilsHZG_Initialize($$)
{
my ($hash) = @_;
}
our $BChash;
sub switti($){
my ($test) = @_;
switch($test) {
case 1 { }
}
}
sub
UWP_GARAGE()
{
my @temps = getResTemps();
my $hours = strftime "%H",localtime();
if($temps[9] > 90 && ReadingsVal("HMW01.O02_UWP_HK2","state","off") eq "off")
{
fhem("set HMW01.O02_UWP_HK2 off");
} elsif ($temps[9] < 90 && ReadingsVal("HMW01.O02_UWP_HK2","state","off") eq "on")
{
fhem("set HMW01.O02_UWP_HK2 off");
}
}
sobald ich einen zweiten Parameter hinzufüge (den ich aber nicht brauche ... ) funktionierts wieder:
sub switti($$){
my ($test) = @_;
switch($test) {
case 1 { }
}
}
kann mir jemand nen Tipp geben?
in der perldoc finde ich nichts, was mir weiterhilft...
Danke,
Stephan
Das hatte ich auch schonmal und habe den Fehler nicht gefunden.
Da switch aber auch ein eigenes Perl Paket benötigt habe ich es auf if umgebaut.
Su könntest auch mal folgendes probieren:
sub switti($){
my $test = shift;
switch($test) {
case 1 { }
}
}
@SabineT: Wird wahrscheinlich auch nicht funktionieren.
Das Problem ist die Kombination von Prototypen und Switch. Switch benutzt Source Filter (Änderung von dem Code, bevor Perl Compiler sieht es), und deswegen gibt es einige bekannte Begrenzungen. Schau mal hier: http://search.cpan.org/~chorny/Switch-2.17/Switch.pm#LIMITATIONS
ZitatMay not work if sub prototypes are used
Lösung:
Entweder vergisst Du einfach die Prototypen:
sub switti {
my ($test) = @_;
switch($test) {
case 1 { }
}
}
oder nutzt ab Perl6 "given... when" statt "switch... case"
oder machst deinen Parameter mit ";" nach "$" Pflicht, damit der Compiler besser reagiert:
sub switti ($;){
my ($test) = @_;
switch($test) {
case 1 { }
}
}
Mehr über Perl Source Filter: http://perldoc.perl.org/perlfilter.html
Und der Bug: https://rt.cpan.org/Public/Bug/Display.html?id=33988
Im allgemein empfehle ich in Perl, auf switch zu verzichten. Eine if/else Kette macht das gleiche. Switch ist oft unmöglich zu debuggen
Danke für eure Hilfe!
Zitat von: amenomade am 22 Mai 2017, 07:53:05
Das Problem ist die Kombination von Prototypen und Switch. Switch benutzt Source Filter (Änderung von dem Code, bevor Perl Compiler sieht es), und deswegen gibt es einige bekannte Begrenzungen. Schau mal hier: http://search.cpan.org/~chorny/Switch-2.17/Switch.pm#LIMITATIONS
Das hatte ich gelesen, aber nicht mit meinem Problem in Zusammenhang gebracht ...
Zitat
Lösung:
oder nutzt ab Perl6 "given... when" statt "switch... case"
Zitat
Im allgemein empfehle ich in Perl, auf switch zu verzichten.
ist given/when dann genauso "schlecht" wie switch?
Ich finde, es macht den code deutlich übersichtlicher und .. kürzer...
Ich probiere given mal aus, und wenn das auch nix ist/sein sollte, dann bau ich halt doch auf if um..
Danke und vg
Stephan
edit: aber seltsam, dass es in der andern 99er (seit längerem) einwandfrei funktioniert ... :P
ZitatDas hatte ich gelesen, aber nicht mit meinem Problem in Zusammenhang gebracht
Die Beschreibung vom Bug ist aber fast Wort zu Wort wie dein erster Post ;)
ZitatWhen declaring and defining a subroutine that contains a switch block, if you include a prototype for a single parameter, this will cause a syntax error on compile if you've included Switch outside of the subroutine. Prototyping multiple parameters does not demonstrate this bug.
Here's some example code that will cause the erroneous syntax error on compile:
#!/bin/perl use Switch;
my $foo = mysub(1);
print "$foo\n";
exit;
sub mysub($) {
my $parm = shift;
switch ($parm) {
case (1) { return "You said 1." }
else { return "You didn't say 1." } } }
#END CODE EXAMPLE
Zitatist given/when dann genauso "schlecht" wie switch?
So weit ich weiss, implementiert given/when eine If/else Sequenz... also, nein.
given/when ist aber in vorherige Versionen von Perl "experimental". Ich weiss nicht, was du nutzt.