[erlang-questions] Best way to interface Erlang with Java code

Michael McDaniel <>
Mon Dec 7 05:00:33 CET 2009


 and another using extra re features  ...


 1> Cmd = "java transform animals.txt ; echo $?" .
"java transform animals.txt ; echo $?" .
 2> {match, [Val,Ret]} = 
             re:run( os:cmd(Cmd),
                     "(?<VAL>.*)(?<RETCODE>[0-9])\\n$", 
                     [dotall,ungreedy,{capture,['VAL','RETCODE'],list}]).
{match, ["Cat\nShark\n...", "1"]}
 3> Ret.
"1"
 4> Val.
"Cat\nShark\n..."
 5> re:split(Val, "\n", [{return,list}]).
["Cat", "Shark", ...]


the above presumes single digit return codes

os:cmd/1 is not the only tool to get other program output; e.g. running
via a port, or using jinterface.  Or maybe the new NIF experimental
feature in R13B03.


~M


On Sun, Dec 06, 2009 at 07:13:52PM -0800, Michael McDaniel wrote:
>  one way ...
> 
> 
>  1> L = re:split (os:cmd ("java transform animals.txt ; echo $?"), "\n").
>  [<<"Cat">>,
>  <<"Shark">>,
>  ........                  % a lot of animal names here (more than 1000)
>  <<"Wolf">>,
>   <<"1">>,<<>>]
> 
>  2> Ret = lists:nth( 2, lists:reverse( L ) ) .
> <<"1">>
>  3> case Ret
>  3> of <<"0">> -> do_something ;
>  3> _          -> do_something_else
>  3> end.
> failure
> 
> 
>  read up on lists and re modules for different ways of playing with
>  the output
> 
> ~Michael
> 
> 
> On Mon, Dec 07, 2009 at 03:37:25AM +0100, zabrane Mikael wrote:
> > Hi Michael !
> > 
> > I found a subtle problem when trying your solution when my program returns a
> > text with one or more "\n".
> > 
> > Eg:
> > 1> re:split (os:cmd ("java transform animals.txt ; echo $?"), "\n").
> > [<<"Cat">>,
> > <<"Shark">>,
> > ........                  % a lot of animal names here (more than 1000)
> > <<"Wolf">>,
> >  <<"1">>,<<>>]
> > 2>
> > 
> > How then can I distinguish between my program output and the error code
> > (which is at the end of the list) ?
> > 
> > Thanks
> > Zabrane
> > 
> > 2009/12/5 Michael <>
> > 
> > >  on my Linux box ...
> > >
> > > $ erl
> > > Erlang R13B03 (erts-5.7.4) [rq:1] [async-threads:0] [hipe]
> > > [kernel-poll:false]
> > >
> > > Eshell V5.7.4  (abort with ^G)
> > > 1> re:split(os:cmd("java x ; echo $?"),"\n").
> > > [<<"Exception in thread \"main\" java.lang.NoClassDefFoundError: x">>,
> > >  <<"1">>,<<>>]
> > > 2>
> > >
> > >
> > > On Sat, Dec 05, 2009 at 06:27:24PM +0100, zabrane Mikael wrote:
> > > > Hi Sean !
> > > >
> > > > Ok I see. But how then cal I handle error code in Erlang if my Java
> > > program
> > > > crash or returns something different from error code 0?
> > > >
> > > > Thanks
> > > > Zabrane
> > > >
> > > > 2009/12/5 Sean Cribbs <>
> > > >
> > > > > zabrane Mikael wrote:
> > > > >
> > > > >> Hi List !
> > > > >>
> > > > >> I've a small program written in "Java" which take a filename (input),
> > > > >> proceed it, and print out
> > > > >> a text (output).
> > > > >>
> > > > >> What's the best way to be able to access to that program from Erlang?
> > > > >> My whish is get back the "output" as an Erlang binary.
> > > > >>
> > > > >> Thanks
> > > > >> Zabrane
> > > > >>
> > > > >>
> > > > >>
> > > > > Use os:cmd/1, which returns a string/list -
> > > > > http://erldocs.com/R13B03/kernel/os.html?search=os&i=5
> > > > >
> > > > > Sean
> > > > >
> > >
> > > ________________________________________________________________
> > > erlang-questions mailing list. See http://www.erlang.org/faq.html
> > > erlang-questions (at) erlang.org
> > >
> 
> ________________________________________________________________
> erlang-questions mailing list. See http://www.erlang.org/faq.html
> erlang-questions (at) erlang.org
> 



More information about the erlang-questions mailing list