如何在Template Toolkit的Perl代码块中返回值用于I2C编程
解决Template Toolkit宏返回变量并传递的问题
问题根源
原代码的核心问题有两个:
- PERL块内创建的结果哈希未同步到Template的变量空间,导致外部无法获取
bin_value - 错误地通过
$stash->get()获取宏参数,应直接使用宏传入的参数值
修改后的核心宏代码
[% MACRO i2c_write(rv, address, data) PERL -%] my ($rv_name, $address_hex, $data_hex) = @_; # 十六进制转十进制 my $address = hex($address_hex); my $data = hex($data_hex); # 格式化为8位二进制字符串 my %result = ( bin_address => sprintf("%08b", $address), bin_data => sprintf("%08b", $data) ); # 将结果绑定到Template指定变量 $stash->set($rv_name, \%result); [% END -%]
调用宏并验证输出
[%# 调用宏,指定结果存入bin_value变量 %] [% i2c_write('bin_value', '0x10', '0x3B') %] [%# 输出验证 %] bin_value.bin_address = [% bin_value.bin_address %] bin_value.bin_data = [% bin_value.bin_data %]
执行后预期输出:
bin_value.bin_address = 00010000 bin_value.bin_data = 00111011
传递变量到解析宏的示例
定义一个解析二进制每一位的宏,直接传入bin_value的属性即可:
[% MACRO parse_binary_bits(bin_str, label) -%] [% "${label} 二进制位解析:" %] [% FOR idx IN 0..7 %] 第[% 7 - idx %]位:[% bin_str.substr(idx, 1) %] [% END %] [% END -%] [%# 传递bin_value的属性到解析宏 %] [% parse_binary_bits(bin_value.bin_address, "I2C地址") %] [% parse_binary_bits(bin_value.bin_data, "I2C数据") %]
内容的提问来源于stack exchange,提问作者varun kumar
相关产品推荐
相关产品推荐

