perl和python区别?
一句话速览:
Python 包 = 目录约定;Java 包 = 目录 + 类路径;Perl 包 = 纯命名空间。同名不同义。
| 维度 | Python 包 | Java 包 | Perl 包 |
|---|---|---|---|
| 本质 | 文件系统目录 + __init__.py |
目录层级 + 包声明 | 逻辑命名空间(package 声明) |
| 物理要求 | 必须对应目录结构 | 必须对应目录结构 | 文件随意,跟目录结构无关 |
| 声明方式 | __init__.py 存在即包 |
package com.xxx; |
package Foo::Bar; |
| 导入语法 | import pkg.mod |
import com.xxx.Cls |
use Foo::Bar; |
| 子层级 | 目录嵌套 | 目录嵌套 | 逻辑 :: 分隔 |
| 文件后缀 | .py |
.java → .class |
.pm |
| 访问符 | . |
. |
:: |
| 元信息 | __init__.py, setup.py |
module-info.java (JPMS) |
our $VERSION |
记忆口诀:
Python/Java 的“包”靠文件夹;
Perl 的“包”只是名字加冒号:
package Foo;
只创建一级命名空间 Foo,简单场景够用。
风险:如果以后还要写 Foo::Bar、Foo::Baz,就会跟 Foo 里的符号混在一起,容易冲突。
package Foo::Bar;
直接声明二级命名空间 Foo::Bar,逻辑更清晰:
Foo 这一层还能留作更高层次的公共接口或工具子包;
子模块 Bar 不会污染 Foo 的符号表。
# 文件 Foo/Bar.pm
package Foo::Bar; # 以后还能有 Foo::Baz、Foo::Util ...
sub hi { "Bar" }
1;
# 使用
use Foo::Bar;
print Foo::Bar::hi; # Bar
如果只想写一个小模块,用 package Foo; 完全没问题;
一旦项目变大,多级命名空间(Foo::Bar) 更易于维护和避免冲突。
海纳百川 ,有容乃大

浙公网安备 33010602011771号