require引用文件路径方法与问题总结

22nd, 2011

同一目录下的文件,如/usr/local/ruby/foo.rb与/usr/local/ruby/bar.rb两个文件。
如果直接在foo.rb中

1 require 'bar'

执行时会报找不到bar.rb错误。
这是因为运行

1 /home/oldsong$ ruby /usr/local/ruby/foo.rb

时会在ruby安装的lib目录和/home/oldsong/目录下查找bar.rb。而不会去rb文件的目录/usr/local/ruby/下查找。
所以除引用系统rb外,require中不能用相对路径。

下面结合我个人经验介绍几种引用单个和目录下所有rb的方法。

1、引用一个文件

例: 引用当前rb同目录下的file_to_require.rb
先介绍3种方法

1 require File.join(__FILE_'../file_to_require')。
2 require File.expand_path('../file_to_require'__FILE__)
3 require File.dirname(__FILE__) + '/file_to_require'

其中,File.expand_path是Rails常用的做法。
__FILE__为常量,表示当前文件的绝对路径,如/home/oldsong/test.rb

法四:

1 $LOAD_PATH.unshift(File.dirname(__FILE__))
2 require 'bar'

先把目录加入LOAD_PATH变量中,然后可直接引用文件名。

2、引用一个目录下所有文件

Ruby没有Java中的import java.io.*;
引用时不能用通配符,估计以后的版本有可能加上。

例:引用当前rb相同目录下lib/文件下所有*.rb文件。
法一:

1 Dir[File.dirname(__FILE__) + '/lib/*.rb'].each {|file| require file }

法二:
一个gem搞定

https://rubygems.org/gems/require_all

### 在 Perl 中使用 `require` 通过路径直接引用 `.pm` 文件的方法 在 Perl 编程环境中,`require` 提供了一种灵活的方式来加载模块或脚本文件。 `use` 不同的是,`require` 更适合动态加载资源,并允许显式指定文件路径[^1]。 #### 明确路径的方式 为了确保可以正确找到所需的 `.pm` 文件,推荐采用绝对路径或者相对路径的形式来调用 `require` 函数。需要注意的一点是,当指定了确切的文件地址时,应当连带 `.pm` 的扩展名一并写入命令之中。例如: ```perl require "/absolute/path/to/Mypack.pm"; # 绝对路径形式 ``` 或是基于当前工作目录设定的相对路径表述: ```perl require "./relative/path/from/current/dir/Mypack.pm"; ``` 这种做法绕过了依赖于全局变量 `@INC` 的查找过程,因此即使目标 `.pm` 文件所在的目录并未列于 `@INC` 内部也不会引发问题[^2]。 #### 示例演示 假设有一个名为 `Mypack.pm` 的模块位于 `/oracle/dev/lib/` 下面,该模块定义了一个简单的打印日志函数 `printlog()`: ```perl # Mypack.pm content package Mypack; use strict; use warnings; sub printlog { print "test\n"; } 1; # 返回真值表示模块加载成功 ``` 接着可以在另一个脚本里这样操作以验证效果: ```perl #!/usr/bin/perl use strict; use warnings; # 方法一:调整 INC 并只给出名字 (不推荐此法因为容易受环境影响) unshift @INC, '/oracle/dev/lib'; require Mypack; # 此处无需 .pm 结尾 Mypack::printlog(); # 方法二:明确指出完整路径加上 .pm 扩展名(推荐实践) require "/oracle/dev/lib/Mypack.pm"; # 必须带有 .pm Mypack::printlog(); ``` 两种方法都能正常输出结果 “test”,不过第二种更为稳健可靠,因为它完全规避了可能存在的关于 `@INC` 设置不当的风险[^3]。 --- #### 特殊情况说明 有时可能会遇到一些特殊状况比如循环依赖等问题,在这些情形下合理规划各个模块之间的关系就显得尤为重要。另外值得注意的是,如果某个`.pm`文件本身存在问题(如语法错误),则无论采取何种途径都会导致整个程序崩溃停止运行,此时就需要借助 `eval {}` 构造来进行基本的安全防护措施[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值