Hallo,
ich bin noch Anfänger in Perl, bitte habt Nachsicht :-)
Ich dachte, "$x // $y" bedeutet das gleiche wie "defined $x ? $x : $y".
Und ich dachte, das könnte ich nach einer RegExp auch mit $1, $2 ... etc. formulieren.
Aber im folgenden Quelltext (ein Auszug) bekomme ich einen Syntaxfehler in der Switch-Anweisung der 2. Funktion, wenn ich in der ersten Funktion den Ausdruck "($5 // 3)" verwende. Schreibe ich stattdessen "defined $5 ? $5 :3", dann gibt es keinen Fehler.
Könnt Ihr mir das erklären?
Ich nutze perl 5.24.0 unter Win10 und perl 5.10.1 unter Linux/Debian.
Danke,
Marc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package main;
use strict;
use warnings;
use POSIX qw(strftime floor);
use Scalar::Util qw(looks_like_number);
use Switch;
sub MyFhem($) {
my ($cmd) = @_;
if ( $cmd =~ /([-_\w]+):([-_\w]+):([-_\w]+)(:([-_\w]+))?/ ) {
$cmd = "set $1 $2 $3";
my $check = { dev => $1, reading => $2, level => $3, retry => 0 };
smInternalTimer( "c_".$1."_".$2, time+( $5 // 3 )*60, "CheckActionDone", $check, 1 );
}
fhem($cmd);
}
my ( $notifytable_sec, $notifytable_min, $notifytable_hour, $notifytable_mday, $notifytable_mon,
$notifytable_year, $notifytable_wday, $notifytable_yday, $notifytable_isdst);
sub MyReadingsVal($$$) {
my ($dev, $rdg, $def) = @_;
my $r='';
if ( $dev eq "TIME" ) {
switch ($rdg) {
case 'hour' { $r = $notifytable_hour }
case 'hfhour' { $r = $notifytable_hour << 1 + ( $notifytable_min > 29 ? 1 : 0 ) }
case 'qhour' { $r = $notifytable_hour << 2 + floor( $notifytable_min/15 ) }
case 'minute' { $r = $notifytable_min }
case 0 { $r = $notifytable_min }
else { $r = undef }
}
} else {
$r = ReadingsVal( $dev, $rdg, $def );
}
return $r;
}
Last edited: 2017-02-05 19:50:07 +0100 (CET)