The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
% -----------------------------------------------------------------------------
% perlport.erl
% -----------------------------------------------------------------------------
% Mastering programmed by YAMASHINA Hio
%
% Copyright 2007 YAMASHINA Hio
% -----------------------------------------------------------------------------
% $Id
% -----------------------------------------------------------------------------
-module(perlport).
-export([start/0, start/1, start/2, call/1, call/2, stop/0, stop/1, test/0]).

% -----------------------------------------------------------------------------
% test().
%
test() ->
	start()
	, io:format("~p~n", [call(1)])
	, io:format("~p~n", [call(atom)])
	, io:format("~p~n", [call("text")])
	, io:format("~p~n", [call([])])
	, io:format("~p~n", [call([1,2,3])])
	, io:format("~p~n", [call([<<"bin">>])])
	, io:format("~p~n", [call(list_to_tuple(lists:seq(1,300)))])
	, io:format("~p~n", [call(1.23)])
	, io:format("~p (self=~p)~n", [call(self()), self()])
	.

% -----------------------------------------------------------------------------
% call(Msg).
%
call(Msg) ->
	call(Msg, perlport).
call(Msg, PortName) ->
	case whereis(PortName) of
	undefined -> undefined;
	Port -> 
		Port ! { self(), { command, term_to_binary(Msg) } },
		receive
			{Port, {data, Any}} -> binary_to_term(Any)
		end
	end.

% -----------------------------------------------------------------------------
% start(). % ./perlport.pl, perlport.
% start(Script).
% start(Script, PortName).
%
start() ->
	start("./perlport.pl").
start(Script) ->
	start(Script, perlport).
start(Script, PortName) ->
	start(Script, PortName, whereis(PortName)).
start(Script, PortName, undefined) ->
	% Script:   "./perlport.pl".
	% PortName: perlport
	Pid = open_port({spawn, Script},[{packet,2}, binary]),
	register(PortName,Pid),
	Pid;
start(_Script, _PortName, Pid) ->
	Pid.

% -----------------------------------------------------------------------------
% stop().
%
stop() ->
	stop(perlport).
stop(PortName) ->
	case whereis(PortName) of
	undefined -> ok;
	Port -> Port ! { self(), close }
	end.

% -----------------------------------------------------------------------------
% End of Module.
% -----------------------------------------------------------------------------