需要帮助来理解Perl脚本

kma*_*mur 0 perl protocols

我正在使用使用PC Link数据协议的万用表VA18B进行串行通信.问题是我找不到该协议的任何文档.我唯一得到的是一个解码帧的Perl脚本(据我所知,帧由14个字节组成).不幸的是,对于根本不了解Perl的人来说,脚本非常复杂.

有人可以解释下面的代码吗?

sub decode_bin_str {
    my ($AC, $DC, $auto, $unknown1,
        $minus, $digi1, $dot1, $digi2, $dot2, $digi3, $dot3, $digi4,
        $micro, $unknown2, $kilo, $diode_test,
        $milli, $percent, $mega, $cont_check,
        $unknown3, $ohm, $rel, $hold,
        $amp, $volt, $hz, $unknown4,
        $min, $unknown5, $celsius, $max) = shift =~
           /^(.)(.)(.)(.)(.)(.{7})(.)(.{7})(.)(.{7})(.)(.{7})
        (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.) *$/x;

    my %digi = (
        "1111101" => 0,
        "0000101" => 1,
        "1011011" => 2,
        "0011111" => 3,
        "0100111" => 4,
        "0111110" => 5,
        "1111110" => 6,
        "0010101" => 7,
        "1111111" => 8,
        "0111111" => 9,
    );

    my $val = ($minus ? "-" : "") . $digi{$digi1} . ($dot1 ? "." : "") .
                    $digi{$digi2} . ($dot2 ? "." : "") .
                    $digi{$digi3} . ($dot3 ? "." : "") .
                    $digi{$digi4};

    my $flags = join(" ", $AC         ? "AC"         : (),
                  $DC         ? "DC"         : (),
                  $auto       ? "auto"       : (),
                  $diode_test ? "diode_test" : (),
                  $cont_check ? "cont_check" : (),
                  $rel        ? "rel"        : (),
                  $hold       ? "hold"       : (),
                  $min        ? "min"        : (),
                  $max        ? "max"        : ());

    my $unit = ($micro   ? "u"   : "") .
           ($kilo    ? "k"   : "") .
           ($milli   ? "m"   : "") .
           ($mega    ? "M"   : "") .
           ($percent ? "%"   : "") .
           ($ohm     ? "Ohm" : "") .
           ($amp     ? "A"   : "") .
           ($volt    ? "V"   : "") .
           ($hz      ? "Hz"  : "") .
           ($celsius ? "C"   : "");

    $val, $flags, $unit;
}

J-1*_*DiZ 5

此函数采用二进制(0/1)字符串.正则表达式是一种模式:

/^(.)(.).....(.{7})......
Run Code Online (Sandbox Code Playgroud)

(.)意思是一个字符,(.{7})意思是其中的一个.

my ($AC, $DC, $auto, $unknown1.......= shift =~ /^(.)(.)(.)(.) ....
Run Code Online (Sandbox Code Playgroud)

意味着1011.....作为输入,AC将是1,DC将是0auto/ unknown1将是1.

Digit1/2/3/4是数字,dot1... dot4告诉你把小数点放在哪里.

auto/ diode_test/ ..说模式..

ohm/ volt/ ....说你正在使用哪个单位.

其余的很简单.