需要帮助来理解Perl脚本

时间:2011-08-05 09:46:13

标签: 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;
}

1 个答案:

答案 0 :(得分:5)

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

/^(.)(.).....(.{7})......

(.)表示一个字符,(.{7})表示其中7个字符。

my ($AC, $DC, $auto, $unknown1.......= shift =~ /^(.)(.)(.)(.) ....

表示,在1011.....作为输入时,AC1DC0auto / {{1}将是unknown1

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

dot4 / auto / ..说模式..

diode_test / ohm / ....说出您正在使用的单位。

其余的很容易。