ruby Herdeoc和sprintf escape%:抛出格式错误的sting%。”;(错误)

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

我试图在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(%{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(“%”)<代码>字符串#%
将原始
%%
转换为单个
%%

然后将该字符串放入
内核#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=