当我在表单帖子中使用整数和浮点数并在我的梁文件中的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
功能。这样一来,您一开始就会发现这是错误的,从而减少了混乱。