>

그래서 파일을 읽고 쓰려고합니다. 파일에 쓰는 동안 파일에 특정 색인이 존재하는지 확인한 다음 쓰지 않고 오류가 발생하지 않습니다. 파일의 데이터는 다음과 같습니다.

{1,{data,dcA,1}}.
{2, {data, dcA, 2}}.
{3,{data,dcA,3}}.

file : consult ()는 이와 같은 파일이 필요하기 때문에 각 줄 끝에 점을 추가했습니다.

이 형식으로되어 있습니다.

{Index, {Data, Node, Index}}

새 파일을 추가해야 할 때이 색인을 확인합니다.

지금까지 시도한 내용은 https://pastebin.com/apnWLk45

입니다.

그리고 다음과 같이 실행합니다 :

193> {ok, P9} = poc:start(test1, self()).
{ok,<0.2863.0>}
194> poc:add(P9, Node, {6, data}).

poc : add/3에서 P9는 파일 : open의 프로세스 ID입니다. 셸에서 이전에 dcA로 정의했습니다. 세 번째는 데이터입니다-이 형식의 데이터- {Index, data}

file : consult/1을 사용하고 있으므로 파일 이름을 매개 변수로 사용합니다. 그 시점에는 프로세스 ID 만 있습니다. 그래서 나는 이름을 file:pid2name(_Server) .

처음으로 실행할 때 완벽하게 실행됩니다.

이 작업을 다시 실행하면 poc : add (P9, Node, {6, data2})이 줄에 오류가 발생합니다. file:pid2name(_Server) .

exception error: no match of right hand side value undefined

이 문제를 어떻게 해결할 수 있습니까?

Erlang을 처음 사용합니다. 일주일 만에 배우기 시작했습니다.


  • 답변 # 1

    와이즈 비즈

    DETS 테이블은 원하는 것을 쉽게 할 수 있습니다 :

    I am trying to read and write into a file. While writing into the file, I need to check if a particular index exist in file then I don't write and throw error.

    쉘에서 :

    -module(my).
    -compile(export_all).
    open_table() ->
        dets:open_file(my_data, [{type, set}, {file, "./my_data.dets"}]).
    close_table() ->
        dets:close(my_data).
    clear_table() ->
        dets:delete_all_objects(my_data).
    insert({Key, _Rest}=Data) ->
        case dets:member(my_data, Key) of 
            true    -> throw(index_already_exists);
            false   -> dets:insert(my_data, Data)
        end.
    all_items() ->
        dets:match(my_data, '$1').
    
    
    와이즈 비즈 와이즈 비즈 프로세스가 파일을 열면 파일 I/O를 처리하는 프로세스에연결됩니다. 즉, 파일을 여는 프로세스가 비정상적으로 종료되면 I/O 프로세스도 종료됩니다. 예를 들면 다음과 같습니다.

    ~/erlang_programs$ erl
    Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
    Eshell V9.2  (abort with ^G)
    1> c(my).
    my.erl:2: Warning: export_all flag enabled - all functions will be exported
    {ok,my}
    2> my:open_table().
    {ok,my_data}
    3> my:clear_table().
    ok
    4> my:all_items().
    []
    5> my:insert({1, {data, a, b}}).
    ok
    6> my:insert({2, {data, c, d}}).
    ok
    7> my:insert({3, {data, e, f}}).
    ok
    8> my:all_items(). 
    [[{1,{data,a,b}}],[{2,{data,c,d}}],[{3,{data,e,f}}]]
    9> my:insert({1, {data, e, f}}).
    ** exception throw: index_already_exists
        in function  my:insert/1 (my.erl, line 15)
    
    

    쉘에서 :

    When I run this again - poc:add(P9, Node, {6, data2}), I get an error in this line file:pid2name(_Server):

    
    

    pid2name () 문서에 따르면 :

    exception error: no match of right hand side value undefined
    
    
    이 함수는 -module(my). -compile(export_all). start() -> {ok, Pid} = file:open('data.txt', [read, write]), spawn(my, add, [Pid, x, y]), exit("bye"). add(Pid, _X, _Y) -> timer:sleep(1000), %Let start() process terminate. {ok, Fname} = file:pid2name(Pid), io:format("~s~n", [Fname]). 를 반환 할 수 있습니다. 오류 메시지가 발생한 내용입니다.

    1> c(my). my.erl:2: Warning: export_all flag enabled - all functions will be exported {ok,my} 2> my:start(). ** exception exit: "bye" in function my:start/0 (my.erl, line 7) 3> =ERROR REPORT==== 25-Jun-2018::13:28:48 === Error in process <0.72.0> with exit value: {{badmatch,undefined},[{my,add,3,[{file,"my.erl"},{line,12}]}]}

  • 이전 http status code 404 - 커스텀 장고 404 오류
  • 다음 javascript - 인수 목록 뒤에 "syntaxerror - missing)"얻기