in reply to Perl to cook you coffee
if ($device eq undef) { die "Usage: <app> /dev/hidrawN"; exit; }
undef is neither a string nor a number. You have to use the defined function to test whether a variable is defined or not. Or you could just test whether @ARGV was empty or not. die exits from the program so using exit there is superfluous.
@ARGV or die "Usage: <app> /dev/hidrawN";
my $report = ord(substr($data, 1, 1)); my $status = ord(substr($data, 2, 1)); my $unit = ord(substr($data, 3, 1)); my $exp = ord(substr($data, 4, 1)); my $lsb = ord(substr($data, 5, 1)); my $msb = ord(substr($data, 6, 1)); my $weight = ($msb * 255 + $lsb) / 10; if($exp != 255 && $exp != 0) { $weight ^= $exp; }
If you used unpack you could extract all your data in one statement and you wouldn't have to calculate the $weight value yourself, which is calculated wrong because you should be multiplying by 256, not 255.
my ( $report, $status, $unit, $exp, $weight ) = unpack 'xCCCCS', $ +data $weight /= 10; if ( $exp != 255 && $exp != 0 ) { $weight ^= $exp; }
In Section
Cool Uses for Perl