【问题标题】:ruby heredoc and sprintf escape %: throwing malformed format sting %" (ArgumentError)ruby heredoc 和 sprintf escape %: throwing malformed format sting %" (ArgumentError)
【发布时间】:2020-11-14 21:39:27
【问题描述】:

我试图在 ruby​​ heredoc 中逃避 %

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

然后我正在尝试打印它

create_assertions.push(sprintf(property_str % {:clock => %Q(my_clk), :reset => %Q(my_rst)}))

如您所见,我已经两次转义了 %%%,但我仍然不断得到:

script.rb:518:in `sprintf': malformed format string - %" (ArgumentError)

谁能指出我哪里可能出错了?

【问题讨论】:

    标签: ruby printf heredoc


    【解决方案1】:

    您的问题是String#%Kernel#sprintf 都在解释字符串中的%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
    

    注意字符串第二行中的return $sformatf("%");String#% 会将原始的 %% 转换为单个 %

    然后您将该字符串通过Kernel#sprintf 并尝试将%" 解释为转义序列并抱怨。

    要么只使用property_str % {:clock =&gt; %Q(my_clk), :reset =&gt; %Q(my_rst)} 来构建你的字符串,要么,如果你真的必须使用这两种格式化方法,将property_str 中的%s 加倍,这样sprintf 将看到%% 并将其转换为单%

    property_str =<<~HEREDOC.strip
        function string get_type_name();
            return $sformatf("%%%%");
        ...
    HEREDOC
    

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 2011-06-25
      • 2011-06-08
      • 2017-11-15
      • 2014-10-20
      • 2022-10-01
      • 2019-08-17
      • 1970-01-01
      • 2018-06-10
      相关资源
      最近更新 更多