Erlang 模块功能详解
1. 引言
Erlang 是一种通用的面向并发的编程语言,它提供了丰富的模块来支持各种功能。本文将详细介绍 Erlang 中多个重要模块的功能和使用方法。
2. CODE 模块
2.1 时间相关函数
| 函数 | 功能 |
|---|---|
universal_time() -> {Date, Time}
| 计算通用时间 |
universal_time_to_local_time({Date1, Time1}) -> {Date2, Time2}
| 将通用时间转换为本地时间 |
valid_date(Year, Month, Day) -> bool()
| 检查日期是否有效 |
2.2 代码路径管理
-
add_patha(Dir) -> true | {error, What}:将目录添加到代码路径的开头。 -
add_pathsa(Dirs) -> ok:将多个目录添加到代码路径的开头。 -
add_pathsz(Dirs) -> ok:将多个目录添加到代码路径的末尾。 -
add_pathz(Dir) -> true | {error, What}:将目录添加到代码路径的末尾。 -
del_path(Name | Dir) -> true | false | {error, What}:从代码路径中删除目录。
2.3 模块管理
-
all_loaded() -> [{Module, Loaded}]:获取所有已加载的模块。 -
clash() -> ok:搜索具有相同名称的模块。 -
delete(Module) -> true | false:移除模块的当前代码。 -
ensure_loaded(Module) -> {module, Module} | {error, What}:确保模块已加载。
2.4 其他功能
-
compiler_dir() -> string():返回编译器的库目录。 -
get_object_code(Module) -> {Module, Binary, Filename} | error:获取模块的目标代码。 -
get_path() -> Path:返回代码服务器的搜索路径。 -
is_loaded(Module) -> {file, Loaded} | false:检查模块是否已加载。 -
lib_dir() -> string():返回 Erlang/OTP 的库目录。 -
lib_dir(Name) -> string() | {error, bad_name}:返回应用程序的库目录。
下面是一个简单的 mermaid 流程图,展示了代码路径管理的基本流程:
graph LR
A[开始] --> B{选择操作}
B -->|添加到开头| C[add_patha 或 add_pathsa]
B -->|添加到末尾| D[add_pathz 或 add_pathsz]
B -->|删除| E[del_path]
C --> F[操作完成]
D --> F
E --> F
F --> G[结束]
3. DETS 模块
3.1 磁盘存储管理
-
all() -> [Name]:返回此节点上所有打开的 DETS 表的名称列表。 -
open_file(Filename) -> {ok, Reference} | {error, Reason}:打开现有的 DETS 表。 -
open_file(Name, Args) -> {ok, Name} | {error, Reason}:打开 DETS 表。 -
close(Name) -> ok | {error, Reason}:关闭 DETS 表。
3.2 数据操作
-
delete(Name, Key) -> ok | {error, Reason}:从 DETS 表中删除具有给定键的所有对象。 -
delete_all_objects(Name) -> ok | {error, Reason}:删除 DETS 表中的所有对象。 -
delete_object(Name, Object) -> ok | {error, Reason}:从 DETS 表中删除给定对象。 -
insert(Name, Objects) -> ok | {error, Reason}:将一个或多个对象插入 DETS 表。 -
insert_new(Name, Objects) -> Bool:将一个或多个对象插入 DETS 表。
3.3 数据查询
-
lookup(Name, Key) -> [Object] | {error, Reason}:返回 DETS 表中具有给定键的所有对象。 -
match(Name, Pattern) -> [Match] | {error, Reason}:匹配 DETS 表中的对象,并返回变量绑定列表。 -
match_object(Name, Pattern) -> [Object] | {error, Reason}:匹配 DETS 表中的对象,并返回对象列表。
3.4 其他功能
-
info(Name) -> InfoList | undefined:返回 DETS 表的信息。 -
info(Name, Item) -> Value | undefined:返回 DETS 表中与给定项关联的信息。 -
sync(Name) -> ok | {error, Reason}:确保对 DETS 表所做的所有更新都写入磁盘。
以下是一个简单的操作 DETS 表的步骤列表:
1. 打开 DETS 表:使用
open_file
函数。
2. 插入数据:使用
insert
或
insert_new
函数。
3. 查询数据:使用
lookup
、
match
或
match_object
函数。
4. 删除数据:使用
delete
、
delete_all_objects
或
delete_object
函数。
5. 关闭 DETS 表:使用
close
函数。
4. DICT 模块
4.1 字典操作
| 函数 | 功能 |
|---|---|
append(Key, Value, Dict1) -> Dict2
| 将值追加到字典中的键 |
append_list(Key, ValList, Dict1) -> Dict2
| 将新值追加到字典中的键 |
erase(Key, Dict1) -> Dict2
| 从字典中擦除键 |
fetch(Key, Dict) -> Value
| 在字典中查找值 |
fetch_keys(Dict) -> Keys
| 返回字典中的所有键 |
filter(Pred, Dict1) -> Dict2
| 选择满足谓词的元素 |
find(Key, Dict) -> {ok, Value} | error
| 在字典中搜索键 |
fold(Fun, Acc0, Dict) -> Acc1
| 对字典应用函数 |
from_list(List) -> Dict
| 将键值对列表转换为字典 |
is_key(Key, Dict) -> bool()
| 测试键是否在字典中 |
map(Fun, Dict1) -> Dict2
| 对字典应用映射函数 |
merge(Fun, Dict1, Dict2) -> Dict3
| 合并两个字典 |
new() -> dictionary()
| 创建一个新字典 |
store(Key, Value, Dict1) -> Dict2
| 在字典中存储值 |
to_list(Dict) -> List
| 将字典转换为键值对列表 |
update(Key, Fun, Dict1) -> Dict2
| 更新字典中的值 |
update(Key, Fun, Initial, Dict1) -> Dict2
| 更新字典中的值 |
update_counter(Key, Increment, Dict1) -> Dict2
| 增加字典中的值 |
下面是一个使用 DICT 模块的简单示例:
%% 创建一个新字典
Dict = dict:new().
%% 存储键值对
NewDict = dict:store(key1, value1, Dict).
%% 查找值
Value = dict:fetch(key1, NewDict).
5. DIGRAPH 模块
5.1 图操作
-
add_edge(G, V1, V2) -> edge() | {error, Reason}:向有向图中添加边。 -
add_vertex(G) -> vertex():添加或修改有向图的顶点。 -
del_edge(G, E) -> true:从有向图中删除边。 -
del_edges(G, Edges) -> true:从有向图中删除多条边。 -
del_path(G, V1, V2) -> true:从有向图中删除路径。 -
del_vertex(G, V) -> true:从有向图中删除顶点。 -
del_vertices(G, Vertices) -> true:从有向图中删除多个顶点。 -
delete(G) -> true:删除有向图。
5.2 图查询
-
edge(G, E) -> {E, V1, V2, Label} | false:返回有向图中边的顶点和标签。 -
edges(G) -> Edges:返回有向图中的所有边。 -
edges(G, V) -> Edges:返回有向图中从或到顶点的边。 -
get_cycle(G, V) -> Vertices | false:在有向图中查找一个环。 -
get_path(G, V1, V2) -> Vertices | false:在有向图中查找一条路径。 -
in_degree(G, V) -> integer():返回有向图中顶点的入度。 -
in_edges(G, V) -> Edges:返回有向图中顶点的入边。 -
in_neighbours(G, V) -> Vertices:返回有向图中顶点的入邻接点。 -
out_degree(G, V) -> integer():返回有向图中顶点的出度。 -
out_edges(G, V) -> Edges:返回有向图中顶点的出边。 -
out_neighbours(G, V) -> Vertices:返回有向图中顶点的出邻接点。 -
vertex(G, V) -> {V, Label} | false:返回有向图中顶点的标签。 -
vertices(G) -> Vertices:返回有向图中的所有顶点。
下面是一个简单的 mermaid 流程图,展示了有向图的基本操作流程:
graph LR
A[开始] --> B{选择操作}
B -->|添加边| C[add_edge]
B -->|添加顶点| D[add_vertex]
B -->|删除边| E[del_edge]
B -->|删除顶点| F[del_vertex]
B -->|查询边| G[edge]
B -->|查询顶点| H[vertex]
C --> I[操作完成]
D --> I
E --> I
F --> I
G --> I
H --> I
I --> J[结束]
6. DIGRAPH_UTILS 模块
6.1 图算法
| 函数 | 功能 |
|---|---|
components(Digraph) -> [Component]
| 返回有向图的连通分量 |
condensation(Digraph) -> CondensedDigraph
| 返回有向图的凝聚图 |
cyclic_strong_components(Digraph) -> [StrongComponent]
| 返回有向图的循环强连通分量 |
is_acyclic(Digraph) -> bool()
| 检查有向图是否无环 |
loop_vertices(Digraph) -> Vertices
| 返回有向图中包含在某个环中的顶点 |
postorder(Digraph) -> Vertices
| 返回有向图的后序遍历顶点 |
preorder(Digraph) -> Vertices
| 返回有向图的前序遍历顶点 |
reachable(Vertices, Digraph) -> Vertices
| 返回从某些顶点可达的顶点 |
reachable_neighbours(Vertices, Digraph) -> Vertices
| 返回从某些顶点可达的邻接点 |
reaching(Vertices, Digraph) -> Vertices
| 返回到达某些顶点的顶点 |
reaching_neighbours(Vertices, Digraph) -> Vertices
| 返回到达某些顶点的邻接点 |
strong_components(Digraph) -> [StrongComponent]
| 返回有向图的强连通分量 |
subgraph(Digraph, Vertices [, Options]) -> Subgraph | {error, Reason}
| 返回有向图的子图 |
topsort(Digraph) -> Vertices | false
| 返回有向图的拓扑排序顶点 |
这些算法可以帮助我们更好地分析和处理有向图,例如判断图是否无环、找到图的连通分量等。在实际应用中,我们可以根据具体需求选择合适的算法来解决问题。
7. DISK_LOG 模块
7.1 磁盘日志管理
-
accessible_logs() -> {[LocalLog], [DistributedLog]}:返回当前节点上可访问的磁盘日志。 -
open(ArgL) -> OpenRet | DistOpenRet:打开磁盘日志文件。 -
close(Log) -> ok | {error, Reason}:关闭磁盘日志。 -
lclose(Log, Node) -> ok | {error, Reason}:在一个节点上关闭磁盘日志。
7.2 日志记录
-
balog(Log, Bytes) -> ok | {error, Reason}:异步记录一个项目到磁盘日志。 -
balog_terms(Log, BytesList) -> ok | {error, Reason}:异步记录多个项目到磁盘日志。 -
blog(Log, Bytes) -> ok | {error, Reason}:记录一个项目到磁盘日志。 -
blog_terms(Log, BytesList) -> ok | {error, Reason}:记录多个项目到磁盘日志。
7.3 日志操作
-
bchunk(Log, Continuation, N) -> {Continuation2, Binaries} | {Continuation2, Binaries, Bad - bytes} | eof | {error, Reason}:读取写入磁盘日志的项目块。 -
block(Log, QueueLogRecords) -> ok | {error, Reason}:阻塞磁盘日志。 -
breopen(Log, File, BHead) -> ok | {error, Reason}:重新打开磁盘日志并保存旧日志。 -
btruncate(Log, BHead) -> ok | {error, Reason}:截断磁盘日志。 -
change_header(Log, Header) -> ok | {error, Reason}:更改磁盘日志所有者的头部或头部函数选项。 -
change_notify(Log, Owner, Notify) -> ok | {error, Reason}:更改磁盘日志所有者的通知选项。 -
change_size(Log, Size) -> ok | {error, Reason}:更改打开的磁盘日志的大小。 -
chunk_info(Continuation) -> InfoList | {error, Reason}:返回磁盘日志块延续的信息。 -
chunk_step(Log, Continuation, Step) -> {ok, Continuation2} | {error, Reason}:在磁盘日志的包装日志文件中向前或向后移动。 -
inc_wrap_file(Log) -> ok | {error, Reason}:切换到磁盘日志的下一个包装日志文件。 -
info(Log) -> InfoList | {error, no_such_log}:返回磁盘日志的信息。 -
pid2name(Pid) -> {ok, Log} | undefined:返回由 PID 处理的磁盘日志的名称。 -
sync(Log) -> ok | {error, Reason}:将磁盘日志的内容刷新到磁盘。 -
unblock(Log) -> ok | {error, Reason}:解除阻塞磁盘日志。
以下是一个简单的使用 DISK_LOG 模块的操作步骤列表:
1. 打开磁盘日志:使用
open
函数。
2. 记录日志:使用
balog
、
balog_terms
、
blog
或
blog_terms
函数。
3. 读取日志:使用
bchunk
函数。
4. 进行其他操作:如阻塞、重新打开、截断等,使用相应的函数。
5. 关闭磁盘日志:使用
close
或
lclose
函数。
8. EPP 模块
8.1 代码预处理
-
open(FileName, IncludePath, PredefMacros) -> {ok,Epp} | {error, ErrorDescriptor}:打开一个文件进行预处理。 -
close(Epp) -> ok:关闭与 Epp 关联的文件的预处理。 -
parse_erl_form(Epp) -> {ok, AbsForm} | {eof, Line} | {error, ErrorInfo}:从打开的 Erlang 源文件中返回下一个 Erlang 形式。 -
parse_file(FileName,IncludePath,PredefMacro) -> {ok,[Form]} | {error,OpenError}:预处理并解析 Erlang 源文件。
下面是一个使用 EPP 模块进行代码预处理的简单示例:
%% 打开文件进行预处理
{ok, Epp} = epp:open("example.erl", [], []).
%% 解析文件
{ok, Forms} = epp:parse_file("example.erl", [], []).
%% 关闭预处理
ok = epp:close(Epp).
9. ERL_EVAL 模块
9.1 元解释器
| 函数 | 功能 |
|---|---|
add_binding(Name, Value, Bindings) -> BindingStruct
| 添加绑定 |
binding(Name, BindingStruct) -> Binding
| 返回绑定 |
bindings(BindingStruct) -> Bindings
| 返回绑定 |
del_binding(Name, Bindings) -> BindingStruct
| 删除绑定 |
expr(Expression, Bindings, LocalFunctionHandler, NonlocalFunctionHandler) -> {value, Value, NewBindings}
| 计算表达式 |
expr_list(ExpressionList, Bindings, LocalFunctionHandler, NonlocalFunctionHandler) -> {ValueList, NewBindings}
| 计算表达式列表 |
exprs(Expressions, Bindings, LocalFunctionHandler, NonlocalFunctionHandler) -> {value, Value, NewBindings}
| 计算表达式 |
new_bindings() -> BindingStruct
| 返回绑定结构 |
这些函数可以帮助我们在运行时动态地计算表达式和管理绑定,为 Erlang 程序的灵活性和可扩展性提供了支持。
10. ERL_PARSE 模块
10.1 解析功能
| 函数 | 功能 |
|---|---|
abstract(Data) -> AbsTerm
| 将 Erlang 项转换为抽象形式 |
format_error(ErrorDescriptor) -> Chars
| 格式化错误描述符 |
normalise(AbsTerm) -> Data
| 将抽象形式转换为 Erlang 项 |
parse_exprs(Tokens) -> {ok, Expr_list} | {error, ErrorInfo}
| 解析 Erlang 表达式 |
parse_form(Tokens) -> {ok, AbsForm} | {error, ErrorInfo}
| 解析 Erlang 形式 |
parse_term(Tokens) -> {ok, Term} | {error, ErrorInfo}
| 解析 Erlang 项 |
tokens(AbsTerm, MoreTokens) -> Tokens
| 为表达式生成标记列表 |
以下是一个使用 ERL_PARSE 模块进行解析的简单示例:
%% 生成标记列表
Tokens = erl_scan:string("1 + 2.").
%% 解析表达式
{ok, Exprs} = erl_parse:parse_exprs(Tokens).
11. ERL_PP 模块
11.1 漂亮打印
| 函数 | 功能 |
|---|---|
attribute(Attribute, HookFunction) -> DeepCharList
| 漂亮打印属性 |
expr(Expression, Indent, Precedence, HookFunction) -> DeepCharList
| 漂亮打印一个表达式 |
exprs(Expressions, Indent, HookFunction) -> DeepCharList
| 漂亮打印表达式 |
form(Form, HookFunction) -> DeepCharList
| 漂亮打印形式 |
function(Function, HookFunction) -> DeepCharList
| 漂亮打印函数 |
guard(Guard, HookFunction) -> DeepCharList
| 漂亮打印守卫 |
这些函数可以帮助我们将 Erlang 代码以更易读的形式输出,提高代码的可读性和可维护性。
12. ERL_SCAN 模块
12.1 标记扫描
| 函数 | 功能 |
|---|---|
format_error(ErrorDescriptor) -> string()
| 格式化错误描述符 |
reserved_word(Atom) -> bool()
| 测试是否为保留字 |
string(CharList) -> {ok, Tokens, EndLine} | Error
| 扫描字符串并返回 Erlang 标记 |
tokens(Continuation, CharList, StartLine) -> Return
| 可重入扫描器 |
下面是一个使用 ERL_SCAN 模块进行标记扫描的简单示例:
%% 扫描字符串
{ok, Tokens, _EndLine} = erl_scan:string("1 + 2.").
13. ERL_TAR 模块
13.1 TAR 操作
-
add(TarDescriptor, Filename, Options) -> RetValue:将文件添加到打开的 TAR 文件。 -
add(TarDescriptor, Filename, NameInArchive, Options) -> RetValue:将文件添加到打开的 TAR 文件。 -
close(TarDescriptor):关闭打开的 TAR 文件。 -
create(Name, FileList) -> RetValue:创建 TAR 存档。 -
create(Name, FileList, OptionList):创建带有选项的 TAR 存档。 -
extract(Name) -> RetValue:从 TAR 文件中提取所有文件。 -
extract(Name, OptionList):从 TAR 文件中提取文件。 -
format_error(Reason) -> string():将错误项转换为可读字符串。 -
open(Name, OpenModeList) -> RetValue:打开 TAR 文件。 -
t(Name):打印 TAR 文件中每个文件的名称。 -
table(Name) -> RetValue:检索 TAR 文件中所有文件的名称。 -
table(Name, Options):检索 TAR 文件中所有文件的名称和信息。 -
tt(Name):打印 TAR 文件中每个文件的名称和信息。
以下是一个使用 ERL_TAR 模块创建和提取 TAR 存档的简单示例:
%% 创建 TAR 存档
ok = erl_tar:create("example.tar", ["file1.erl", "file2.erl"], []).
%% 提取 TAR 存档
ok = erl_tar:extract("example.tar", []).
14. ERLANG 模块
14.1 基本函数
| 函数 | 功能 |
|---|---|
abs(Number) -> int() | float()
| 计算算术绝对值 |
apply(Fun, Args) -> term() | empty()
| 将函数应用于参数列表 |
apply(Module, Function, Args) -> term() | empty()
| 将函数应用于参数列表 |
atom_to_list(Atom) -> string()
| 将原子转换为字符串 |
binary_to_list(Binary) -> [char()]
| 将二进制转换为列表 |
binary_to_list(Binary, Start, Stop) -> [char()]
| 将部分二进制转换为列表 |
binary_to_term(Binary) -> term()
| 解码 Erlang 外部项格式二进制 |
check_process_code(Pid, Module) -> bool()
| 检查进程是否正在执行模块的旧代码 |
concat_binary(ListOfBinaries)
| 连接二进制列表(已弃用) |
date() -> {Year, Month, Day}
| 获取当前日期 |
delete_module(Module) -> true | undefined
| 使模块的当前代码变为旧代码 |
disconnect_node(Node) -> bool() | ignored
| 强制断开节点连接 |
element(N, Tuple) -> term()
| 获取元组的第 N 个元素 |
erase() -> [{Key, Val}]
| 返回并删除进程字典 |
erase(Key) -> Val | undefined
| 返回并删除进程字典中的值 |
erlang:append_element(Tuple1, Term) -> Tuple2
| 向元组追加额外元素 |
erlang:bump_reductions(Reductions) -> void()
| 增加减少计数器 |
erlang:cancel_timer(TimerRef) -> Time | false
| 取消定时器 |
erlang:demonitor(MonitorRef) -> true
| 停止监控 |
erlang:demonitor(MonitorRef, OptionList) -> true
| 停止监控 |
erlang:display(Term) -> true
| 在标准输出上打印项 |
erlang:error(Reason)
| 以给定原因停止执行 |
erlang:error(Reason, Args)
| 以给定原因停止执行 |
erlang:fault(Reason)
| 以给定原因停止执行 |
erlang:fault(Reason, Args)
| 以给定原因停止执行 |
erlang:fun_info(Fun) -> [{Item, Info}]
| 获取函数信息 |
erlang:fun_info(Fun, Item) -> {Item, Info}
| 获取函数信息 |
erlang:fun_to_list(Fun) -> string()
| 将函数转换为字符串 |
erlang:function_exported(Module, Function, Arity) -> bool()
| 检查函数是否已导出并加载 |
erlang:get_cookie() -> Cookie | nocookie
| 获取本地节点的魔术 cookie |
erlang:get_stacktrace() -> [{Module, Function, Arity | Args}]
| 获取最后一次异常的调用堆栈回溯 |
erlang:hash(Term, Range) -> Hash
| 哈希函数(已弃用) |
erlang:hibernate(Module, Function, Args)
| 使进程休眠直到收到消息 |
erlang:info(Type) -> Res
| 获取系统信息(已弃用) |
erlang:integer_to_list(Integer, Base) -> string()
| 将整数转换为字符串 |
erlang:is_builtin(Module, Function, Arity) -> bool()
| 检查函数是否为用 C 实现的 BIF |
erlang:list_to_integer(String, Base) -> int()
| 将字符串转换为整数 |
erlang:loaded() -> [Module]
| 获取所有已加载的模块列表 |
erlang:localtime() -> {Date, Time}
| 获取当前本地日期和时间 |
erlang:localtime_to_universaltime({Date1, Time1}) -> {Date2, Time2}
| 将本地时间转换为协调世界时(UTC) |
erlang:localtime_to_universaltime({Date1, Time1}, IsDst) -> {Date2, Time2}
| 将本地时间转换为协调世界时(UTC) |
erlang:make_tuple(Arity, InitialValue) -> tuple()
| 创建具有给定arity 的新元组 |
erlang:md5(Data) -> Digest
| 计算 MD5 消息摘要 |
erlang:md5_final(Context) -> Digest
| 完成 MD5 上下文更新并返回计算的 MD5 消息摘要 |
erlang:md5_init() -> Context
| 创建 MD5 上下文 |
erlang:md5_update(Context, Data) -> NewContext
| 使用数据更新 MD5 上下文并返回新上下文 |
erlang:memory() -> [{Type, Size}]
| 获取动态分配内存的信息 |
erlang:memory(Type | [Type]) -> Size | [{Type, Size}]
| 获取动态分配内存的信息 |
erlang:monitor(Type, Item) -> MonitorRef
| 开始监控 |
erlang:monitor_node(Node, Flag, Options) -> true
| 监控节点状态 |
erlang:phash(Term, Range) -> Hash
| 便携式哈希函数 |
erlang:phash2(Term [, Range]) -> Hash
| 便携式哈希函数 |
erlang:port_call(Port, Operation, Data) -> term()
| 同步调用端口并传递项数据 |
erlang:port_info(Port) -> [{Item, Info}] | undefined
| 获取端口信息 |
erlang:port_info(Port, Item) -> {Item, Info} | undefined | []
| 获取端口信息 |
erlang:port_to_list(Port) -> string()
| 将端口标识符转换为字符串 |
erlang:ports() -> [port()]
| 获取所有打开的端口 |
erlang:process_display(Pid, Type) -> void()
| 在标准错误上写入本地进程信息 |
erlang:raise(Class, Reason, Stacktrace)
| 以给定类、原因和调用堆栈回溯停止执行 |
erlang:read_timer(TimerRef) -> int() | false
| 获取定时器剩余的毫秒数 |
erlang:ref_to_list(Ref) -> string()
| 将引用转换为字符串 |
erlang:resume_process(Pid) -> true
| 恢复暂停的进程 |
erlang:send(Dest, Msg) -> Msg
| 发送消息 |
erlang:send(Dest, Msg, [Option]) -> Res
| 有条件地发送消息 |
erlang:send_after(Time, Dest, Msg) -> TimerRef
| 启动定时器 |
erlang:send_nosuspend(Dest, Msg) -> bool()
| 尝试发送消息而不阻塞 |
erlang:send_nosuspend(Dest, Msg, Options) -> bool()
| 尝试发送消息而不阻塞 |
erlang:set_cookie(Node, Cookie) -> true
| 设置节点的魔术 cookie |
erlang:spawn_monitor(Fun) -> {pid(),reference()}
| 创建并监控新进程,以函数为入口点 |
erlang:spawn_monitor(Module, Function, Args) -> {pid(),reference()}
| 创建并监控新进程,以函数为入口点 |
erlang:start_timer(Time, Dest, Msg) -> TimerRef
| 启动定时器 |
erlang:suspend_process(Pid) -> true
| 暂停进程 |
erlang:system_flag(Flag, Value) -> OldValue
| 设置系统标志 |
erlang:system_info(Type) -> Res
| 获取系统信息 |
erlang:system_monitor() -> MonSettings
| 获取当前系统性能监控设置 |
erlang:system_monitor(undefined | {MonitorPid, Options}) -> MonSettings
| 设置或清除系统性能监控选项 |
erlang:system_monitor(MonitorPid, [Option]) -> MonSettings
| 设置系统性能监控选项 |
erlang:trace(PidSpec, How, FlagList) -> int()
| 设置进程或进程的跟踪标志 |
erlang:trace_delivered(Tracee) -> Ref
| 通知跟踪已交付 |
erlang:trace_info(PidOrFunc, Item) -> Res
| 获取进程或函数的跟踪信息 |
erlang:trace_pattern(MFA, MatchSpec) -> int()
| 设置全局调用跟踪的跟踪模式 |
erlang:trace_pattern(MFA, MatchSpec, FlagList) -> int()
| 设置函数调用跟踪的跟踪模式 |
erlang:universaltime() -> {Date, Time}
| 获取当前协调世界时(UTC)日期和时间 |
erlang:universaltime_to_localtime({Date1, Time1}) -> {Date2, Time2}
| 将协调世界时(UTC)转换为本地时间 |
erlang:yield() -> true
| 让其他进程有机会执行 |
exit(Reason)
| 以给定原因停止执行 |
exit(Pid, Reason) -> true
| 向进程发送退出信号 |
float(Number) -> float()
| 将数字转换为浮点数 |
float_to_list(Float) -> string()
| 将浮点数转换为字符串 |
garbage_collect() -> true
| 强制立即对调用进程进行垃圾回收 |
garbage_collect(Pid) -> bool()
| 强制立即对进程进行垃圾回收 |
get() -> [{Key, Val}]
| 返回进程字典 |
get(Key) -> Val | undefined
| 返回进程字典中的值 |
get_keys(Val) -> [Key]
| 返回进程字典中具有给定值的键列表 |
group_leader() -> GroupLeader
| 获取调用进程的组领导者 |
group_leader(GroupLeader, Pid) -> true
| 设置进程的组领导者 |
halt()
| 停止 Erlang 运行时系统,并向调用环境指示正常退出 |
halt(Status)
| 停止 Erlang 运行时系统 |
hd(List) -> term()
| 获取列表的头部 |
integer_to_list(Integer) -> string()
| 将整数转换为字符串 |
iolist_size(Item) -> int()
| 计算 iolist 的大小 |
iolist_to_binary(IoListOrBinary) -> binary()
| 将 iolist 转换为二进制 |
is_alive() -> bool()
| 检查本地节点是否存活 |
is_atom(Term) -> bool()
| 检查项是否为原子 |
is_binary(Term) -> bool()
| 检查项是否为二进制 |
is_boolean(Term) -> bool()
| 检查项是否为布尔值 |
is_float(Term) -> bool()
| 检查项是否为浮点数 |
is_function(Term) -> bool()
| 检查项是否为函数 |
is_function(Term, Arity) -> bool()
| 检查项是否为具有给定 arity 的函数 |
is_integer(Term) -> bool()
| 检查项是否为整数 |
is_list(Term) -> bool()
| 检查项是否为列表 |
is_number(Term) -> bool()
| 检查项是否为数字 |
is_pid(Term) -> bool()
| 检查项是否为 PID |
is_port(Term) -> bool()
| 检查项是否为端口 |
is_process_alive(Pid) -> bool()
| 检查进程是否存活 |
is_record(Term, RecordTag) -> bool()
| 检查项是否看起来像记录 |
is_record(Term, RecordTag, Size) -> bool()
| 检查项是否看起来像记录 |
is_reference(Term) -> bool()
| 检查项是否为引用 |
is_tuple(Term) -> bool()
| 检查项是否为元组 |
length(List) -> int()
| 计算列表的长度 |
link(Pid) -> true
| 创建到另一个进程(或端口)的链接 |
list_to_atom(String) -> atom()
| 将字符串转换为原子 |
list_to_binary(IoList) -> binary()
| 将列表转换为二进制 |
list_to_existing_atom(String) -> atom()
| 将字符串转换为现有原子 |
list_to_float(String) -> float()
| 将字符串转换为浮点数 |
list_to_integer(String) -> int()
| 将字符串转换为整数 |
list_to_pid(String) -> pid()
| 将字符串转换为 PID |
list_to_tuple(List) -> tuple()
| 将列表转换为元组 |
load_module(Module, Binary) -> {module, Module} | {error, Reason}
| 加载模块的目标代码 |
make_ref() -> ref()
| 返回几乎唯一的引用 |
module_loaded(Module) -> bool()
| 检查模块是否已加载 |
monitor_node(Node, Flag) -> true
| 监控节点状态 |
node() -> Node
| 获取本地节点的名称 |
node(Arg) -> Node
| 获取 PID、端口或引用所在的节点 |
nodes() -> Nodes
| 获取系统中所有可见节点 |
nodes(Arg | [Arg]) -> Nodes
| 获取系统中某种类型的所有节点 |
now() -> {MegaSecs, Secs, MicroSecs}
| 获取自 00:00 GMT 以来的经过时间 |
open_port(PortName, PortSettings) -> port()
| 打开端口 |
pid_to_list(Pid) -> string()
| 将 PID 转换为字符串 |
port_close(Port) -> true
| 关闭打开的端口 |
port_command(Port, Data) -> true
| 向端口发送数据 |
port_connect(Port, Pid) -> true
| 设置端口的所有者 |
port_control(Port, Operation, Data) -> Res
| 在端口上执行同步控制操作 |
pre_loaded() -> [Module]
| 获取所有预加载的模块列表 |
process_flag(Flag, Value) -> OldValue
| 设置调用进程的进程标志 |
process_flag(Pid, Flag, Value) -> OldValue
| 设置进程的进程标志 |
process_info(Pid) -> [{Item, Info}] | undefined
| 获取进程信息 |
process_info(Pid, Item) -> {Item, Info} | undefined | []
| 获取进程信息 |
processes() -> [pid()]
| 获取所有进程 |
purge_module(Module) -> void()
| 移除模块的旧代码 |
put(Key, Val) -> OldVal | undefined
| 向进程字典中添加新值 |
register(RegName, Pid | Port) -> true
| 为 PID(或端口)注册名称 |
registered() -> [RegName]
| 获取所有注册的名称 |
round(Number) -> int()
| 对数字进行四舍五入并返回整数 |
self() -> pid()
| 获取调用进程的 PID |
setelement(Index, Tuple1, Value) -> Tuple2
| 设置元组的第 N 个元素 |
size(Item) -> int()
| 计算元组或二进制的大小 |
spawn(Fun) -> pid()
| 创建新进程,以函数为入口点 |
spawn(Node, Fun) -> pid()
| 在给定节点上创建新进程,以函数为入口点 |
spawn(Module, Function, Args) -> pid()
| 创建新进程,以函数为入口点 |
spawn(Node, Module, Function, ArgumentList) -> pid()
| 在给定节点上创建新进程,以函数为入口点 |
spawn_link(Fun) -> pid()
| 创建并链接到新进程,以函数为入口点 |
spawn_link(Node, Fun) -> pid()
| 在指定节点上创建并链接到新进程,以函数为入口点 |
spawn_link(Module, Function, Args) -> pid()
| 创建并链接到新进程,以函数为入口点 |
spawn_link(Node, Module, Function, Args) -> pid()
| 在给定节点上创建并链接到新进程,以函数为入口点 |
spawn_opt(Fun, [Option]) -> pid() | {pid(),reference()}
| 创建新进程,以函数为入口点 |
spawn_opt(Node, Fun, [Option]) -> pid()
| 在给定节点上创建新进程,以函数为入口点 |
spawn_opt(Module, Function, Args, [Option]) -> pid() | {pid(),reference()}
| 创建新进程,以函数为入口点 |
spawn_opt(Node, Module, Function, Args, [Option]) -> pid()
| 在给定节点上创建新进程,以函数为入口点 |
这些函数提供了 Erlang 语言的基本功能和操作,涵盖了数学计算、进程管理、节点通信、数据处理等多个方面。在实际开发中,我们可以根据具体需求选择合适的函数来实现各种功能。
15. 总结
本文详细介绍了 Erlang 中多个重要模块的功能和使用方法,包括 CODE、DETS、DICT、DIGRAPH、DIGRAPH_UTILS、DISK_LOG、EPP、ERL_EVAL、ERL_PARSE、ERL_PP、ERL_SCAN、ERL_TAR 和 ERLANG 模块。通过这些模块,我们可以实现代码路径管理、磁盘存储、字典操作、图算法、日志记录、代码预处理、解析、漂亮打印、TAR 操作以及各种基本的 Erlang 功能。希望这些信息对您在 Erlang 开发中有所帮助。
16. 模块功能总结与对比
为了更清晰地了解各个模块的主要功能,下面通过表格进行总结对比:
| 模块 | 主要功能 |
| — | — |
| CODE | 时间计算、代码路径管理、模块加载与删除等 |
| DETS | 磁盘存储管理、数据操作与查询 |
| DICT | 键值字典操作,如追加、查找、合并等 |
| DIGRAPH | 有向图的创建、修改与查询 |
| DIGRAPH_UTILS | 有向图的算法处理,如连通分量计算、拓扑排序等 |
| DISK_LOG | 磁盘日志的管理、记录与操作 |
| EPP | Erlang 代码预处理 |
| ERL_EVAL | 元解释器,动态计算表达式和管理绑定 |
| ERL_PARSE | Erlang 代码解析 |
| ERL_PP | Erlang 代码漂亮打印 |
| ERL_SCAN | 标记扫描 |
| ERL_TAR | TAR 文件的创建、提取等操作 |
| ERLANG | 提供 Erlang 语言的基本功能,如数学计算、进程管理等 |
从这个表格中可以看出,不同模块针对不同的应用场景提供了相应的功能,开发者可以根据具体需求选择合适的模块。
17. 实际应用案例
17.1 日志记录与管理
在一个分布式系统中,需要记录各个节点的操作日志。可以使用 DISK_LOG 模块来实现:
graph LR
A[开始] --> B[打开磁盘日志]
B --> C[记录日志]
C --> D{是否需要读取日志?}
D -->|是| E[读取日志]
D -->|否| F{是否结束?}
E --> F
F -->|否| C
F -->|是| G[关闭磁盘日志]
G --> H[结束]
操作步骤如下:
1. 打开磁盘日志:使用
open
函数。
{ok, Log} = disk_log:open([{name, my_log}, {file, "my_log.dlog"}]).
-
记录日志:使用
blog或blog_terms函数。
ok = disk_log:blog(Log, "Operation: User logged in").
-
读取日志:使用
bchunk函数。
{Cont, Binaries} = disk_log:bchunk(Log, start, 10).
-
关闭磁盘日志:使用
close函数。
ok = disk_log:close(Log).
17.2 图算法应用
在社交网络分析中,用户之间的关系可以用有向图表示。使用 DIGRAPH 和 DIGRAPH_UTILS 模块可以分析用户之间的连通性和影响力:
graph LR
A[开始] --> B[创建有向图]
B --> C[添加顶点和边]
C --> D[计算连通分量]
D --> E[进行拓扑排序]
E --> F[结束]
操作步骤如下:
1. 创建有向图:使用
new
函数。
G = digraph:new().
-
添加顶点和边:使用
add_vertex和add_edge函数。
digraph:add_vertex(G, user1).
digraph:add_vertex(G, user2).
digraph:add_edge(G, user1, user2).
-
计算连通分量:使用
components函数。
Components = digraph_utils:components(G).
-
进行拓扑排序:使用
topsort函数。
TopSort = digraph_utils:topsort(G).
18. 注意事项
18.1 模块兼容性
在使用多个模块时,需要注意模块之间的兼容性。例如,某些模块的函数可能依赖于其他模块的特定版本或状态。在升级或更换模块时,要进行充分的测试,确保系统的稳定性。
18.2 资源管理
一些模块涉及到资源的使用,如 DISK_LOG 模块的磁盘日志文件、ERL_TAR 模块的 TAR 文件等。在使用完这些资源后,要及时释放,避免资源泄漏。例如,使用完磁盘日志后要调用
close
函数关闭日志文件。
18.3 错误处理
在调用模块函数时,要对可能出现的错误进行处理。大多数模块的函数在出错时会返回特定的错误信息,开发者可以根据这些信息进行相应的处理。例如,在打开磁盘日志时,如果文件不存在或权限不足,
open
函数会返回错误信息,开发者可以根据错误信息进行提示或重试操作。
19. 总结与展望
19.1 总结
本文全面介绍了 Erlang 中多个重要模块的功能和使用方法,通过表格、流程图和实际应用案例,帮助读者更好地理解和掌握这些模块。这些模块为 Erlang 开发者提供了丰富的工具,能够实现各种复杂的功能,如代码管理、数据存储、图算法等。
19.2 展望
随着分布式系统和并发编程的发展,Erlang 的应用场景将越来越广泛。未来,这些模块可能会不断更新和完善,提供更多的功能和更好的性能。例如,在图算法模块中,可能会增加更多的高级算法,以满足更复杂的图分析需求;在日志记录模块中,可能会提供更高效的存储和查询方式。开发者可以持续关注这些模块的发展,不断提升自己的开发能力。
希望本文对您在 Erlang 开发中有所帮助,让您能够更加熟练地使用这些模块来实现各种功能。在实际开发中,要根据具体需求选择合适的模块,并注意资源管理和错误处理,以确保系统的稳定性和可靠性。
超级会员免费看

74

被折叠的 条评论
为什么被折叠?



