如何从模板工具包中的 Perl 块返回值

问题描述 投票:0回答:1

我正在研究模板工具包脚本。我的脚本需要将十六进制数转换为二进制数,并需要将该二进制数应用于 i2c 编程。我坚持返回二进制值并使用这些位来编程 i2c。

[% MACRO i2c_write(rv,address,data) PERL -%]
my %rv;
my $address = hex($stash->get('address'));
my $data = hex($stash->get('data'));
my $bin_add = sprintf("%08b",$address);
my $bin_data = sprintf("%08b",$data);
$rv{bin_address} = $bin_add;
$rv{bin_data} = $bin_data;
[% END -%]

[% i2c_write(bin_value,'0x10','0x3B') %]

Expected output:
bin_value.bin_address = 00010000
bin_value.bin_data    = 00111011

我想将这个 bin_value.bin_address 和 bin_value.bin_data 解析为另一个宏(仍在编写宏)。

在另一个宏中,将获取每一位并打印每一位

perl templates template-toolkit
1个回答
0
投票

您似乎想将哈希名称传递给宏并将值存储在该哈希中。您可以使用存储库来实现此目的,例如:

p.pl:

use v5.38;
use Template;

my $template = Template->new({
    INCLUDE_PATH => '.',  # or specify your own directory
    EVAL_PERL    => 1,    # enable Perl code in template
});
my $vars = {
    bin_value => {
        bin_address => '',
        bin_data => '',
    }
};
$template->process('example.tt', $vars) || die $template->error();

示例.tt:

[% MACRO i2c_write(rv_name, address, data) PERL -%]
    my $hash_name = $stash->get('rv_name');
    my $rv =  $stash->get($hash_name);
    my $address = hex($stash->get('address'));
    my $data = hex($stash->get('data'));
    $rv->{bin_address} = sprintf("%08b", $address);
    $rv->{bin_data} = sprintf("%08b", $data);
[% END -%]
[% i2c_write('bin_value', '0x10', '0x3B') -%]
[% bin_value.bin_address %]

输出

00010000
© www.soinside.com 2019 - 2024. All rights reserved.