我是Erlang的新手。 我只需要从make_ref()返回的数字。 所以,如果make_ref()返回:#Ref< 0.0.0.441> 我想从中提取441.
知道怎么做吗?
答案 0 :(得分:4)
请改为尝试:
unique_integer() ->
try
erlang:unique_integer()
catch
error:undef ->
{MS, S, US} = erlang:now(),
(MS*1000000+S)*1000000+US
end.
修改强>:
此解决方案与使用io_lib:format("~p", [Ref])
提取整数之间的主要区别在于速度。当我的解决方案在R18中大约需要40ns时,转换为列表,regexp并返回整数需要9μs。我会提高两个数量级的解决方案。
答案 1 :(得分:-1)
有一个AudioInputStream in= AudioSystem.getAudioInputStream(file);
AudioInputStream din = AudioSystem.getAudioInputStream(decodedFormat, in);
byte[] data = new byte[4096];
long nBufferFramesToStart = (long) (startTime*targetFormat.getFrameRate()*targetFormat.getFrameSize()/data.length);
for(int i = 0; i < nBufferFramesToStart; i++){ //Go to this point in the audio file
din.read(data, 0, data.length);
}
函数可以将ref转换为列表,但是文档警告不要在生产代码中使用它。我们可以使用erlang:ref_to_list/1
代替。将ref转换为列表后,我们可以使用正则表达式提取数字。
这是一个从ref:
的字符串表示中提取数字的函数io_lib:format/2
要仅获取ref的字符串表示的最后一个数字,您可以像这样使用它:
extract_from_ref(Ref) when is_reference(Ref) ->
[RefString] = io_lib:format("~p", [Ref]),
{match, L} = re:run(RefString,
"#Ref<(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)>",
[{capture, all_but_first, list}]),
IntList = lists:map(fun list_to_integer/1, L),
list_to_tuple(IntList).