http://qs321.pair.com?node_id=886611


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; }