当我在表单帖子中使用整数和浮点数并在我的梁文件中的ebin文件中接收到这些数字时,我遇到了问题。希望可以有人帮帮我。

npower.yaws

   <erl>
kv(K,L) ->
{value, {K, V}} = lists:keysearch(K,1,L), V.
out(A) ->
L = yaws_api:parse_post(A),
N = kv("number", L),
    npower62:math3(N).
    </erl>


npower62.erl编译为梁文件
-module(npower62)。
-export([math3 / 1])。

math3([N])->
数字= N,
Nsquare =数字*数字,
{html,io_lib:format(“〜c的平方=〜w”,[N,Nsquare])}。

给我3的平方= 2601
代替
3的平方= 9
我尝试使用Number = list_to_integer(atom_to_list(N))(无效)
我尝试使用Number = list_to_float(atom_to_list(N))(无效)
我尝试使用Number = list_to_integer(N)(无效)

最佳答案

首先,可以缩小math3/1函数接受的范围:

-module(npower62).
-export([math3/1]).

math3(N) when is_number(N) ->
  N2 = N * N,
  io_lib:format("square of ~p = ~p", [N, N2]).


注意,我们已经重写了很多功能。它不再接受列表,而是任何数字,仅N。另外,传递给io_lib:format/2的格式字符串完全关闭,请参见man -erl io

我们现在可以攻击偏航代码:

<erl>
  kv(K,L) ->
      proplists:get_value(K, L, none).

  out(A) ->
    L = yaws_api:parse_post(A),
    N = kv("number", L),
    none =/= N, %% Assert we actually got a value from the kv lookup

    %% Insert type mangling of N here so N is converted into an Integer I
    %% perhaps I = list_to_integer(N) will do. I don't know what type parse_post/1
    %% returns.

    {html, npower62:math3(I)}
</erl>


请注意,您的kv/2函数可以与属性列表查找函数一起编写。在您的代码变体中,从kv/2返回的值是{value, {K, V}},在您的math3/1版本中永远不会正确。 proplists:get_value/3仅返回V部分。另请注意,我将{html,...}提升到了这一水平。让npower62处理它是不好的样式,因为它不知道在偏航函数中被调用的事实。

我的猜测是您需要调用list_to_integer(N)。解决此问题的最简单方法是使用对error_logger:info_report([{v, N}])的调用,并在外壳程序或日志文件中查找INFO REPORT,然后查看N是什么术语。

TL; DR:问题在于您的值在整个地方都不匹配。因此,您可能会遇到大量函数崩溃的问题,这些函数可能会捕获,记录并存活下来。然后,这会使您困惑不已。

另外,从npower62:math3/1外壳测试功能erl功能。这样一来,您一开始就会发现这是错误的,从而减少了混乱。

08-25 18:28