- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一般来说,在不考虑任何特定平台的情况下,Perl 中的 Cwd::cwd
和 Cwd::getcwd
之间有什么区别?为什么 Perl 两者兼而有之?预期用途是什么,在什么场景下应该使用哪一种? (我们将不胜感激示例用例。)这重要吗? (假设我不混合它们。)选择其中任何一个会以任何方式影响可移植性吗?模块中哪一种更常用?
即使我解释手册说除了极端情况 cwd
是 `pwd`
并且 getcwd
只是调用 getcwd
来自 unistd.h
,实际区别是什么?无论如何,这仅适用于 POSIX 系统。
我总是可以阅读实现,但这并没有告诉我这些函数的含义。实现细节可能会改变,但定义的含义并非如此。 (否则会发生重大变化,这是一件很严重的事情。)
引用 Perl 的 Cwd module manpage :
Each of these functions are called without arguments and return the absolute path of the current working directory.
getcwd
my $cwd = getcwd();
Returns the current working directory.
Exposes the POSIX function getcwd(3) or re-implements it if it's not available.
cwd
my $cwd = cwd();
The cwd() is the most natural form for the current architecture. For most systems it is identical to `pwd` (but without the trailing line terminator).
在注释部分:
- Actually, on Mac OS, the
getcwd()
,fastgetcwd()
andfastcwd()
functions are all aliases for thecwd()
function, which, on Mac OS, calls `pwd`. Likewise, theabs_path()
function is an alias forfast_abs_path()
好的,我知道在 Mac OS1 上,getcwd()
和 cwd()
之间没有区别,因为两者实际上都可以归结为到`pwd`
。但在其他平台上呢? (我对 Debian Linux 特别感兴趣。)
1 经典 Mac OS,而非 OS X。对于 Mac,$^O
值为 MacOS
和 darwin
分别是操作系统和 OS X。 谢谢,@tobyink和 @ikegami .
还有一个小问题:如何避免对具有非常相似功能的其他模块提出类似的问题?除了深入研究实现之外,是否有通用的方法来发现差异? (目前,我认为如果文档不清楚预期用途和差异,我必须请教更有经验的人或自己阅读实现。)
最佳答案
我认为这个想法是 cwd()
始终解析为获取当前工作目录的外部、特定于操作系统的方式。也就是说,在 Linux 上运行 pwd
,在 DOS 上运行 command/c cd
,在 QNX 中运行 /usr/bin/fullpath -t
等等— 所有示例均来自实际的 Cwd.pm
。如果可用,getcwd()
应该使用 POSIX 系统调用,如果不可用,则回退到 cwd()
。
为什么我们两者都有?在当前的实现中,我相信仅导出 getcwd()
对于大多数系统来说就足够了,但谁知道为什么“如果系统调用可用,则使用它,否则运行 cwd()”的逻辑
”在某些系统上可能会失败(例如 on MorphOS in Perl 5.6.1 )。
在 Linux 上,cwd()
将运行 `/bin/pwd`
(将实际执行二进制文件并获取其输出),而 getcwd()
将发出 getcwd(2)
系统调用。
strace
检查实际效果可以使用 strace(1)
来查看实际情况:
使用cwd()
:
$ strace -f perl -MCwd -e 'cwd(); ' 2>&1 | grep execve
execve("/usr/bin/perl", ["perl", "-MCwd", "-e", "cwd(); "], [/* 27 vars */]) = 0
[pid 31276] execve("/bin/pwd", ["/bin/pwd"], [/* 27 vars */] <unfinished ...>
[pid 31276] <... execve resumed> ) = 0
使用getcwd()
:
$ strace -f perl -MCwd -e 'getcwd(); ' 2>&1 | grep execve
execve("/usr/bin/perl", ["perl", "-MCwd", "-e", "getcwd(); "], [/* 27 vars */]) = 0
Cwd.pm
源代码您可以查看源代码( Cwd.pm
,例如在 CPAN 中),并看到对于 Linux cwd()
调用映射到 _backtick_pwd
,如下所示顾名思义,用反引号调用pwd
。
这是来自 Cwd.pm
的片段,其中包含我的评论:
unless ($METHOD_MAP{$^O}{cwd} or defined &cwd) {
...
# some logic to find the pwd binary here, $found_pwd_cmd is set to 1 on Linux
...
if( $os eq 'MacOS' || $found_pwd_cmd )
{
*cwd = \&_backtick_pwd; # on Linux we actually go here
}
else {
*cwd = \&getcwd;
}
}
最后,两者之间的区别在于调用另一个二进制文件的 cwd()
必须更慢。我们可以进行某种性能测试:
$ time perl -MCwd -e 'for (1..10000) { cwd(); }'
real 0m7.177s
user 0m0.380s
sys 0m1.440s
现在将其与系统调用进行比较:
$ time perl -MCwd -e 'for (1..10000) { getcwd(); }'
real 0m0.018s
user 0m0.009s
sys 0m0.008s
但是,由于您通常不会太频繁地查询当前工作目录,因此这两个选项都可以工作 - 除非由于与 ulimit
、内存不足情况等相关的某种原因而无法生成更多进程.
最后,至于选择使用哪一个:对于 Linux,我总是使用 getcwd()
。我想,如果您要编写一段可移植的代码,该代码将在某个非常奇怪的平台上运行(当然,Linux、OS X 和 Windows 不包括在内),您将需要进行测试并选择要使用的函数。奇怪的平台列表)。
关于working-directory - Perl Cwd::cwd 和 Cwd::getcwd 函数有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25219996/
我有 table 像这样 -------------------------------------------- id size title priority
我的应用在不同的 Activity (4 个 Activity )中仅包含横幅广告。所以我的疑问是, 我可以对所有横幅广告使用一个广告单元 ID 吗? 或者 每个 Activity 使用不同的广告单元
我有任意(但统一)数字列表的任意列表。 (它们是 n 空间中 bin 的边界坐标,我想绘制其角,但这并不重要。)我想生成所有可能组合的列表。所以:[[1,2], [3,4],[5,6]] 产生 [[1
我刚刚在学校开始学习 Java,正在尝试自定义控件和图形。我目前正在研究图案锁,一开始一切都很好,但突然间它绘制不正确。我确实更改了一些代码,但是当我看到错误时,我立即将其更改回来(撤消,ftw),但
在获取 Distinct 的 Count 时,我在使用 Group By With Rollup 时遇到了一个小问题。 问题是 Rollup 摘要只是所有分组中 Distinct 值的总数,而不是所有
这不起作用: select count(distinct colA, colB) from mytable 我知道我可以通过双选来简单地解决这个问题。 select count(*) from (
这个问题在这里已经有了答案: JavaScript regex whitespace characters (5 个回答) 2年前关闭。 你能解释一下为什么我会得到 false比较 text ===
这个问题已经有答案了: 奥 git _a (56 个回答) 已关闭 9 年前。 我被要求用 Javascript 编写一个函数 sortByFoo 来正确响应此测试: // Does not cras
所以,我不得不说,SQL 是迄今为止我作为开发人员最薄弱的一面。也许我想要完成的事情很简单。我有这样的东西(这不是真正的模型,但为了使其易于理解而不浪费太多时间解释它,我想出了一个完全模仿我必须使用的
这个问题在这里已经有了答案: How does the "this" keyword work? (22 个回答) 3年前关闭。 简而言之:为什么在使用 Objects 时,直接调用的函数和通过引用传
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: what is the difference between (.) dot operator and (-
我真的不明白这里发生了什么但是: 当我这样做时: colorIndex += len - stopPos; for(int m = 0; m < len - stopPos; m++) { c
思考 MySQL 中的 Group By 函数的最佳方式是什么? 我正在编写一个 MySQL 查询,通过 ODBC 连接在 Excel 的数据透视表中提取数据,以便用户可以轻松访问数据。 例如,我有:
我想要的SQL是这样的: SELECT week_no, type, SELECT count(distinct user_id) FROM group WHERE pts > 0 FROM bas
商店表: +--+-------+--------+ |id|name |date | +--+-------+--------+ |1 |x |Ma
对于 chrome 和 ff,当涉及到可怕的 ie 时,这个脚本工作完美。有问题 function getY(oElement) { var curtop = 0; if (oElem
我现在无法提供代码,因为我目前正在脑海中研究这个想法并在互联网上四处乱逛。 我了解了进程间通信和使用共享内存在进程之间共享数据(特别是结构)。 但是,在对保存在不同 .c 文件中的程序使用 fork(
我想在用户集合中使用不同的功能。在 mongo shell 中,我可以像下面这样使用: db.users.distinct("name"); 其中名称是用于区分的集合字段。 同样我想要,在 C
List nastava_izvjestaj = new List(); var data_context = new DataEvidencijaDataContext();
我的 Rails 应用程序中有 Ransack 搜索和 Foundation,本地 css 渲染正常,而生产中的同一个应用程序有一个怪癖: 应用程序中的其他内容完全相同。 我在 Chrome 和 Sa
我是一名优秀的程序员,十分优秀!