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