仅从erlang中的ref中提取数字

时间:2015-07-14 10:39:58

标签: functional-programming erlang

我是Erlang的新手。 我只需要从make_ref()返回的数字。 所以,如果make_ref()返回:#Ref< 0.0.0.441> 我想从中提取441.

知道怎么做吗?

2 个答案:

答案 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).