2011年8月28日日曜日

Erlang re replace 正規表現 Sample サンプル 1つ以上を置換

前回だか、正規表現を使って文字列を置換しようとして、初めにパターンマッチしたものしか置換できなくて困っていた。
だが、パターンマッチしてヒットしたものすべてを置換することに成功。そのサンプルを。
しかし、もっと良いやり方があるのではと思う。reモジュールをもっと勉強しないと。だが、直近で正規表現は必要ない。正規表現はまた別の機会に。

ソース:

-module(re_replace_multi).
-export([start/0,binList_to_list/1]).

%%--------------------------------------------------------------------
%% @doc
%% @spec start() -> list() | error
%% @end
%%--------------------------------------------------------------------
start() ->
    Regexp = ["Erlang"],
    %% compile the Regular Expression
    case re:compile (Regexp) of
{ok,MP} ->
   Subject = ["My favorite Language is Erlang. Erlang. Erlang."],
   do_regexp (MP,Subject);
{error, ErrSpec} ->
   io:format ("Compile Error ~p~n",[ErrSpec]),
   error
    end.
 
%%--------------------------------------------------------------------
%% @doc
%% @spec do_regexp(MP) -> list() | error
%% @type MP = mp()
%% @end
%%--------------------------------------------------------------------
do_regexp (MP,Subject) ->
 
    io:format("subject:~p~n",[Subject]),

    case re:run(Subject, MP) of
{match, Captured} ->
   io:format ("match:~p~n",[Captured]),
   Rep = "Ruby",
   io:format("Replace to ~p from \"Erlang\".~n",[Rep]),
   Replace = re:replace(Subject, MP, [Rep]),
   %Tmp = [binary_to_list(X) || X <- Replace],
   %Replace1 = lists:append(Tmp),
   Sub = binList_to_list (Replace),
   do_regexp(MP,[Sub]);
nomatch ->
   io:format ("nomatch~n"),
   Subject
    end.
%%--------------------------------------------------------------------
%% @doc
%% @spec binList_to_list (list() | binary()) -> list()
%% @end
%%--------------------------------------------------------------------
binList_to_list ([]) ->
    [];
binList_to_list (Lists)
  when is_binary(Lists)
-> binary_to_list(Lists);
binList_to_list (Lists)
  when is_list(Lists)
-> [Head|Tails] = Lists,
  case is_binary(Head) of
      true ->
  HeadStr = binary_to_list(Head),
  HeadStr ++ binList_to_list(Tails);
      false ->
  Head ++ binList_to_list(Tails)
  end.

実行結果:
1> c(re_replace_multi).
{ok,re_replace_multi}
2> re_replace_multi:start().
subject:["My favorite Language is Erlang. Erlang. Erlang."]
match:[{24,6}]
Replace to "Ruby" from "Erlang".
subject:["My favorite Language is Ruby. Erlang. Erlang."]
match:[{30,6}]
Replace to "Ruby" from "Erlang".
subject:["My favorite Language is Ruby. Ruby. Erlang."]
match:[{36,6}]
Replace to "Ruby" from "Erlang".
subject:["My favorite Language is Ruby. Ruby. Ruby."]
nomatch
["My favorite Language is Ruby. Ruby. Ruby."]
3> 

Erlang re replace マッチした文字を置換する Sample サンプル

パターンマッチした文字を置換しようとしていたときのサンプル。
最初にマッチしたものしかできなかった。
エレガントじゃないので、あまり載せたくないけど。

ソース:

-module(re_replace).
-export([start/0,binList_to_list/1]).

%%--------------------------------------------------------------------
%% @doc
%% @spec start() -> list() | error
%% @end
%%--------------------------------------------------------------------
start() ->
    Regexp = ["Erlang"],
    %% compile the Regular Expression
    case re:compile (Regexp) of
{ok,MP} ->
   do_regexp (MP);
{error, ErrSpec} ->
   io:format ("Compile Error ~p~n",[ErrSpec]),
   error
    end.
   
%%--------------------------------------------------------------------
%% @doc
%% @spec do_regexp(MP) -> list() | error
%% @type MP = mp()
%% @end
%%--------------------------------------------------------------------
do_regexp (MP) ->
    Subject = ["My favorite Language is Erlang. Erlang. Erlang."],
    io:format("subject:~p~n",[Subject]),

    case re:run(Subject, MP) of
{match, Captured} ->
   io:format ("match:~p~n",[Captured]),
   Rep = "Ruby",
   io:format("Replace to ~p from \"Erlang\".~n",[Rep]),
   Replace = re:replace(Subject, MP, [Rep]),
   %Tmp = [binary_to_list(X) || X <- Replace],
   %Replace1 = lists:append(Tmp),
   binList_to_list (Replace);
nomatch ->
   io:format ("nomatch~n"),
   error
    end.
%%--------------------------------------------------------------------
%% @doc
%% @spec binList_to_list (list() | binary()) -> list()
%% @end
%%--------------------------------------------------------------------
binList_to_list ([]) ->
    [];
binList_to_list (Lists)
  when is_binary(Lists)
-> binary_to_list(Lists);
binList_to_list (Lists)
  when is_list(Lists)
-> [Head|Tails] = Lists,
  case is_binary(Head) of
      true ->
  HeadStr = binary_to_list(Head),
  HeadStr ++ binList_to_list(Tails);
      false ->
  Head ++ binList_to_list(Tails)
  end.

出力結果:
4> re_replace:start().
subject:["My favorite Language is Erlang. Erlang. Erlang."]
match:[{24,6}]
Replace to "Ruby" from "Erlang".
"My favorite Language is Ruby. Erlang. Erlang."
5> 

今ひらめいた。パターンマッチした文字を全て置換する方法。
今度載せようと思う。

Erlang re compile エラー サンプル Sample

Erlangのreモジュールのcompileメソッドでエラーを出してみた。

ソース:

-module(re_compile_exception).
-export([start/0]).

%%--------------------------------------------------------------------
%% @doc
%% @spec start() ->
%% @end
%%--------------------------------------------------------------------
start () ->
    do_exception().

%%--------------------------------------------------------------------
%% @doc
%% @spec do_exception() -> ok | error.
%% @end
%%--------------------------------------------------------------------
do_exception () ->
    Regexp = "*Erlang",
    case re:compile(Regexp) of
{ok, MP} ->
   io:format("Success to compile MP:~p~n", [MP]),
   ok;
{error, ErrSpec} ->
   io:format("ErrSpec:~p~n", [ErrSpec]),
   error
end.

出力結果:
3> re_compile_exception:start().
ErrSpec:{"nothing to repeat",0}
error
4> 

Erlang re 正規表現 Sample サンプル

Erlangの正規表現モジュールであるreのサンプルを貼る。
1つの文の中で、マッチする部分が複数あった場合、すべてを箇所を抽出してほしいけど、それができない。勉強したいが、Erlangのドキュメントの英語がよくわからない。

ソース:

-module(re_Test).
-export([start/0]).

%%--------------------------------------------------------------------
%% @doc
%% @spec start() -> ok | error
%% @end
%%--------------------------------------------------------------------
start() ->
    Regexp = ["Erlang"],
    case re:compile (Regexp) of
{ok,MP} ->
   do_regexp (MP),
   ok;
{error, ErrSpec} ->
   io:format ("Compile Error ~p~n",[ErrSpec]),
   error
    end.
   
%%--------------------------------------------------------------------
%% @doc
%% @spec do_regexp(MP) ->
%% @type MP = mp()
%% @end
%%--------------------------------------------------------------------
do_regexp (MP) ->
    Subject = ["My favorite Language is Erlang."],
    Subject2 = ["I want to study Python."],
   
    case re:run(Subject, MP) of
{match, Captured} ->
   io:format ("match:~p~n",[Captured]);
nomatch ->
   io:format ("nomatch~n")
    end,
   
    case re:run(Subject2, MP) of
{match, Captured2} ->
   io:format ("match:~p~n",[Captured2]);
nomatch  ->
   io:format ("nomatch2~n")
    end.

出力結果:
1> c(re_Test).
{ok,re_Test}
2> re_Test:start().
match:[{24,6}]
nomatch2
ok

2011年8月21日日曜日

wxErlang 勉強するためのサイト

wxErlangに初めて手をつける人のためのサイトと思われるところを発見。
wxerlang workups : http://wxerlang.dougedmunds.com/

本ブログでは、基本的にサンプルしか載せず、その解説はしないため、こういうサイトは非常に役に立つ。

2011年8月20日土曜日

Erlang wx_object behaviour Sample サンプル

ビヘイビアを使ってみた。
まだまだよくわからない。
サンプルにもなるのかはわからない。


動作画面:

ソースサンプル:

-module(wx_objectTest).
-export([start/0]).
-export([new/2, show/1]).  %% API
-export([init/1, handle_call/3, handle_event/2]).
-export([terminate/2,handle_info/2,code_change/3]).
-include("wx.hrl").
-behaviour(wx_object).

start() ->
    Wx = wx:new(),
    new(Wx,?wxID_ANY).
   
%% Client API
new(Parent, Id) ->
    io:format("new~n"),
    %% @spec start(Mod, Args, Options) -> wxWindow().
    %% Starts a generic wx_object server
    %% and invokes Mod:init(Args) in the new process.
     wx_object:start(?MODULE, [Parent,Id], []).

show(Dialog) ->
    io:format("show~n"),
    wxWindow:show(Dialog).

%% Server Implementation ala gen_server
init([Parent, Id]) ->
    io:format("init~n"),
     Dialog = wxDialog:new(Parent, Id, "Testing", []),
    wxDialog:connect(Dialog,close_window),
    show(Dialog),
    MyState = "init",
    {Dialog, MyState}.

handle_call(show, _From, State) ->
    io:format("handle_call~n"),
    {reply, ok, State}.

handle_event(#wx{event=#wxClose{}}, State) ->
    io:format("handle_event~n"),
    io:format("~p Closing window ~n",[self()]),
    wx:destroy(),
    {noreply, State}.

code_change(OldVsn, State, Extra) ->
  io:format("Upgrading from ~p with extra data ~p~n", [OldVsn, Extra]),
  { ok, State }.

terminate(Reason,State) ->
    io:format("Terminating ~p for reason ~p state:~p~n", [ self(), Reason,State ]),
    ok.

handle_info(Msg, State) ->
  io:format("Unexpected Info ~p~n", [Msg]),
  { noreply, State }.

赤字が最低限定義しなければならないものかな。
wx.hrlはErlangインストールディレクトリ配下を検索して探してください。

wx_objectTest:start().を実行すると画面が表示される。
start
→new
→init
→show
の順で動作し、
画面を閉じると
handle_eventが動作する。

2011年8月15日月曜日

Erlang is_function Sample サンプル

手こずった。
サンプルは以下。

ソース:

-module(is_functionTest).
-export([start/0]).

start() ->
    Double = fun(X) -> double(X) end,
    if is_function(Double) =:= true ->
   funA;
true -> true
    end.

double(X) ->
    2 * X.

うまくいくと、端末に「funA」と表示される。

2011年8月8日月曜日

Erlang wxProgressDialog Sample サンプル

進捗バーのあれです。
サンプルできたので、貼っておく。無いよりまし。

今回は進捗バーがすぐに消えてしまうため、キャプチャはない。
じゃあ、キャプチャが取れるようにすればいいのだが、眠いのである。
(「眠い」と書くと、ブログ内の広告が「眠い」関連になる。)

ソース:

-module(progressdialogTest).
-include_lib("wx.hrl").

-export([start/0]).

start()->
    Wx = wx:new(),
    {Frame,PD} = wx:batch(fun() -> create_window(Wx) end),
    wxWindow:show(Frame),
    Count = 1,
    updater(Count,PD),
    loop(Frame),
    wx:destroy(),
    ok.

create_window(Wx)->

    Frame = wxDialog:new(Wx,
   -1,
   "Progress Test",
[{size,{300,200}}]),

    Option = [{maximum,100},{parent,Frame}],
    %%Option = [{maximum,100}],

    %% Create Dialog
    PDialog = wxProgressDialog:new("ProgressDialog Example",
 "Progress Test...",
 Option),
    %% insert sleep
    timer:sleep(300),

    %% Set Connect Close
    wxFrame:connect(Frame, close_window),

    {Frame,PDialog}.

loop(Frame) ->
    receive
% Window Close Event
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   wxWindow:destroy(Frame),
   ok
    end.

updater(Count,PD) ->
    if Count =< 100 ->
   io:format("Count:~p~n",[Count]),
   wxProgressDialog:update(PD,Count),
   updater(Count + 1,PD);
true ->
   ok
    end.

wx.hrlはErlangインストールディレクトリを漁ってください。

参考:
nori's tech days: ProgressDialog(その2) : http://blog.tonic-water.com/2008/04/progressdialog_30.html

2011年8月7日日曜日

Erlang file set_cwd Sample サンプル

実行プログラムのカレントディレクトリを変更する関数set_cwd。
サンプル作った。

サンプル:

-module(setcwdTest).
-export([start/0]).

%% please create directory "zip_work" on current directory.
%% this program create directory "setcwdTest" on "zip_work".
%% warning : if you execute this program on EShell,
%%           Current directory at EShell exchange to "zip_work"
%%           directory.
start() ->
    case file:get_cwd() of
{ok,Cwd} ->
   io:format("Currnet:~p~n",[Cwd]),
   SetCwd = "zip_work",
   setTest(SetCwd);
{error,Reason} ->
   io:format("Error:~p~n",[Reason]),
   error
    end.

setTest(Cwd) ->
    try
case file:set_cwd(Cwd) of
   ok -> file:make_dir("setcwdTest");
   {error,Reason} -> io:format("set_cwd Error:~p~n",[Reason])
end
    catch
_ -> io:format("setTest throw exception~n")
    end.

Erlang file:get_cwd Sample サンプル

現在のカレントディレクトリのパスを取得する関数。
絶対パスで取得する。

ピクチャ:

ソース:

-module(cwdTest).
-export([start/0]).

start() ->
    case file:get_cwd() of
{ok,Cwd} ->
   io:format("Currnet:~p~n",[Cwd]),
   ok;
{error,Reason} ->
   io:format("Error:~p~n",[Reason]),
   error
    end.