ruby Herdeoc和sprintf escape%:抛出格式错误的sting%。”;(错误)
我试图在ruby Herdeoc中逃离ruby Herdeoc和sprintf escape%:抛出格式错误的sting%。”;(错误),ruby,printf,heredoc,Ruby,Printf,Heredoc,我试图在ruby Herdeoc中逃离% property_str =<<~HEREDOC.strip function string get_type_name(); return $sformatf("%%"); endfunction: get_type_name property signal_x(ctrl_signal); @(posedge %{clock}) disable iff(%{res
%
property_str =<<~HEREDOC.strip
function string get_type_name();
return $sformatf("%%");
endfunction: get_type_name
property signal_x(ctrl_signal);
@(posedge %{clock}) disable iff(%{reset} || $isunknown(%{reset}) || assertion_disable)
(~$isunknown(ctrl_signal));
endproperty: signal_x
HEREDOC
如您所见,我对%%
进行了双转义%%
,但我仍然得到:
script.rb:518:in `sprintf': malformed format string - %" (ArgumentError)
有人能告诉我哪里可能出错吗?您的问题是和都在解释字符串中的%
s。这:
create_assertions.push(sprintf(property_str % {:clock => %Q(my_clk), :reset => %Q(my_rst)}))
同:
fmt = property_str % {:clock => %Q(my_clk), :reset => %Q(my_rst)}
create_assertions.push(sprintf(fmt))
而fmt
将如下所示:
function string get_type_name();
return $sformatf("%");
endfunction: get_type_name
property signal_x(ctrl_signal);
@(posedge my_clk) disable iff(my_rst || $isunknown(my_rst) || assertion_disable)
(~$isunknown(ctrl_signal));
endproperty: signal_x
注意返回$sformaf(“%”)字符串第二行中的code><代码>字符串#%
将原始%%
转换为单个%%
然后将该字符串放入内核#sprintf
,它试图将%“
解释为转义序列并发出抱怨
只使用属性str%{:clock=>%Q(my_clk),:reset=>%Q(my_rst)}
来构建字符串,或者,如果您确实必须使用这两种格式方法,则将属性str中的%
加倍,以便sprintf
将看到%
,并将其转换为单个%
:
property_str =<<~HEREDOC.strip
function string get_type_name();
return $sformatf("%%%%");
...
HEREDOC
property\u str=您的问题是和都在解释字符串中的%
s。这是:
create_assertions.push(sprintf(property_str % {:clock => %Q(my_clk), :reset => %Q(my_rst)}))
同:
fmt = property_str % {:clock => %Q(my_clk), :reset => %Q(my_rst)}
create_assertions.push(sprintf(fmt))
而fmt
将如下所示:
function string get_type_name();
return $sformatf("%");
endfunction: get_type_name
property signal_x(ctrl_signal);
@(posedge my_clk) disable iff(my_rst || $isunknown(my_rst) || assertion_disable)
(~$isunknown(ctrl_signal));
endproperty: signal_x
请注意字符串第二行中的返回$sformaf(“%”;
。字符串#%
将原始%%
转换为单个%%
然后将该字符串放入内核#sprintf
,它试图将%“
解释为转义序列并发出抱怨
只使用属性str%{:clock=>%Q(my_clk),:reset=>%Q(my_rst)}
来构建字符串,或者,如果您确实必须使用这两种格式方法,则将属性str中的%
加倍,以便sprintf
将看到%
,并将其转换为单个%
:
property_str =<<~HEREDOC.strip
function string get_type_name();
return $sformatf("%%%%");
...
HEREDOC
property\u str=