Can someone tell me how to do this best way?
I have no idea about what your are doing, an don't know of the context.
But to make your code more readable, get your indenting right. If you are lazy, use perltidy. And it's prettify.
use strict;
use utf8;
use warnings;
use Mojo::JSON qw|from_json|;
use bytes;
use MBclient;
sub new {
... .;
}
sub _device_read {
# $d as data
# $mbc as ModBusControl
# $r as response
my ( $d, $mbc, $r ) = ( shift, MBclient->new(), undef );
# parse device config
$d->{regs} = from_json( $d->{regs} );
# setup device attributes
$mbc->host( $d->{ip} );
$mbc->port( $d->{port} );
$mbc->unit_id(0); # by default.
# for all specified registers
foreach my $reg ( keys %{ $d->{regs}->{r} } ) {
$r->{$reg} = _prettify_byte(
# read data from device registers
$mbc->read_input_registers(
# converting text register address to hex
hex($reg),
# specify number of registers to read
$d->{regs}->{r}->{$reg}
)
);
}
return ($r);
}
# converts from hex data to deximal
# recieve output from modbus sensors
sub _prettify_byte {
# okay state of deal
return (
sprintf( '%.2f', unpack( 'f', pack( 's2', @{ $_[0] }[ 1, 0 ] )
+ ) ) )
if ( $_[0] );
#return error message
return ( $c{_err_} );
}
perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'