免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5666 | 回复: 14

关于 $0得到了两种值 [复制链接]

论坛徽章:
4
处女座
日期:2013-09-01 19:30:07双鱼座
日期:2013-09-28 10:58:45双子座
日期:2014-05-23 08:32:0215-16赛季CBA联赛之八一
日期:2016-04-12 19:55:42
发表于 2014-09-09 14:57 |显示全部楼层
本帖最后由 atgc 于 2014-09-10 09:05 编辑

mytest.pl内容如下
print $0,"\n";

执行:得到的 $0的值是不一样的,为什么?
D:\test>perl mytest.pl
mytest.pl

D:\test>mytest.pl
D:\test\mytest.pl

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
发表于 2014-09-09 15:22 |显示全部楼层
因为第一个被执行的进程不一样.

论坛徽章:
4
处女座
日期:2013-09-01 19:30:07双鱼座
日期:2013-09-28 10:58:45双子座
日期:2014-05-23 08:32:0215-16赛季CBA联赛之八一
日期:2016-04-12 19:55:42
发表于 2014-09-09 15:28 |显示全部楼层
q1208c 发表于 2014-09-09 15:22
因为第一个被执行的进程不一样.

谢谢,能否详细指教?

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
发表于 2014-09-09 15:38 |显示全部楼层
回复 3# atgc

我也是一知半解.

$0 应该是指的第一个被运行的进程. perl <xxx.pl> 这种方式, xxx.pl 肯定不是第一个被调用的了. 至少前面有个 perl . 而这个 perl 应该是 底层的 代码, 它未必会被加载到 命令行参数中.


不过,  一般很少人直接用 $0 吧? 不是应该是 @ARGV


   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2014-09-09 15:39 |显示全部楼层
本帖最后由 jason680 于 2014-09-09 15:41 编辑

回复 1# atgc

C:\bat>perl mytest.pl
mytest.pl

C:\bat>mytest.pl
C:\bat\mytest.pl

C:\bat>ver

Microsoft Windows [版本 6.3.9600]  <== windows 8

C:\bat>perl -v

This is perl 5, version 18, subversion 0 (v5.18.0) built for MSWin32-x86-multi-thread-64int <== Strawberry Perl
...
  

论坛徽章:
4
处女座
日期:2013-09-01 19:30:07双鱼座
日期:2013-09-28 10:58:45双子座
日期:2014-05-23 08:32:0215-16赛季CBA联赛之八一
日期:2016-04-12 19:55:42
发表于 2014-09-09 16:12 |显示全部楼层
jason680 发表于 2014-09-09 15:39
回复 1# atgc

C:\bat>perl mytest.pl

谢谢,我不知道你说的啥意思
我的例子比较简单,就是执行test.pl的时候,如果用perl test.pl的方式合直接test.pl
得到的$0的值是不一样的,想知道为什么?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-09-09 18:13 |显示全部楼层
本帖最后由 flw 于 2014-09-09 18:14 编辑

这话应该反过来问:为什么你会认为两种不同的调用方式得到的 $0 应该是一样的?

如果你是想要在不管任何时候都能够获取脚本的名字的话,
那么这事儿没你想的那么容易。
好在有一个模块已经做了类似的事情,你可以看看:
https://metacpan.org/pod/FindBin

新程序员步入的另一个误区是倾向用已知工具解决问题,即使那是错误的工具。我们把这称
为“XY问题”,通常它的说法是“如何用X解决Y?”有时,他们是如此痴迷于工具X,以至
于干脆不提Y,直接说“我正在尝试用X,但结果总是不对。”我们必须问他们“你真正想做
的是什么?”通常,我必须多问几次,他们才肯说出想要解决的Y且不基于他们认为必须使
用的X。一旦真正理解了Y,我们就能指给他们正确的X去解决。这时程序员通常惊讶于存在
解决问题的更好办法。他们只是从来没想到可能有更好的办法。

最主要的问题是,新程序员似乎觉得电脑应该能读取他们的思想,并以人能做到的某种方式
处理模糊性,抑或处理人类都不能处理的模糊性。讽刺的是,他们向别人寻求帮助时,会再
次假定别人也能读取他们的思想,即便他们还没向别人传达想要解决的问题、已尝试的办法
、错误消息、输入数据、机器和系统或其他任何与程序不工作可能真正相关的东西,例如程
序使用的语言。他们说的话听起来就像:“我写了这个程序,而它不工作,现在你有义务告
诉我如何修正它,尽管我没有告诉你关于它的任何信息。”


程序员只需要对问题做足够的思考,从而向别人解释明白,答案常常就会显而易见。但程序
员在状态最佳时也是懒人,而新程序员还不知道自己有多少不懂的,也就不知道如何寻求帮
助。他们还处在婴儿水平:“只要哭得够大声,妈妈就会来做好一切。”学会高效地沟通真
的会更好。但很多人认为沟通仅仅意味着说出自己所想,却没有认识到它意味着必须考虑怎
样才能在别人脑子里产生你希望的结果。你理解自己所说的并不意味着别人也理解。无法沟
通时人们应该责怪自己,而不是听的人。当然,与计算机沟通也一样。“为什么这台愚蠢的
电脑不肯做我想让它做的?”或许你需要先学会理解计算机。

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
发表于 2014-09-09 22:32 |显示全部楼层
底下所有的脚本 ( load.pl, test.pl ), 在 Linux 环境下测试:

第1: perldoc -v '$0'
你会看到 ~ {:2_172:}
  1. $0      Contains the name of the program being executed.
复制代码
  1. 0美元包含正在执行的程序的名称。
复制代码
  1. 0 元包含正在执行的程序的名称。
复制代码
但是: 你执行得到的 $0的值不一样 ~ {:2_170:}


D:\test>perl mytest.pl
  1. load.pl
复制代码
D:\test>mytest.pl
  1. D:\test\mytest.pl
复制代码
为什么? {:2_170:}

你看到一个名字 load.pl
什么是 load.pl ?

pl ? 当你看到 pl,也许你认为这是一个 Perl 脚本 ? 正是! 这是一个 Perl 脚本.

我们将编写一个 Perl 脚本, 他的名字是 load.pl


/tmp/fake/load.pl
  1. use 5.010;
  2. do $ARGV[0];
复制代码
我们编写一个 test.pl 脚本
  1. #!/usr/bin/perl
  2. use 5.010;

  3. say "my \$0 is $0";
  4. say "i am test";
复制代码
in bash shell:
  1. export perl='/usr/bin/perl /tmp/fake/load.pl'
复制代码
第2: 测试!!你会看到

perl test.pl
  1. my $0 is load.pl
  2. i am test
复制代码
chmod +x test.pl
./test.pl
  1. my $0 is ./test.pl
  2. i am test
复制代码
所以,你的这个 perl, 是一个假的 perl ~ {:2_172:}


回复 1# atgc


   

论坛徽章:
4
处女座
日期:2013-09-01 19:30:07双鱼座
日期:2013-09-28 10:58:45双子座
日期:2014-05-23 08:32:0215-16赛季CBA联赛之八一
日期:2016-04-12 19:55:42
发表于 2014-09-10 09:06 |显示全部楼层
pitonas 发表于 2014-09-09 22:32
底下所有的脚本 ( load.pl, test.pl ), 在 Linux 环境下测试:

第1: perldoc -v '$0'

我晕,是我写错了,应该是print出来的是mytest.pl

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
发表于 2014-09-10 12:18 |显示全部楼层
nima.jpg

嘿嘿,你说这个让我想起小时候,这期间,记载了我许多成长的故事。

在2014年 XXX 开源技术会议上:

formalin15 从口袋里掏出了一张名片递了过去,问:  Larry Wall, 你知道我是谁 ?
Larry Wall 一边喝着咖啡,一边轻敲键盘:
  1. use 5.018;
  2. say 'hello';
复制代码
笑着回答: formalin15




另一天

一个家伙在湖南, 他的名字也是 formalin15 ,
他写信问 Larry Wall, 嘿嘿,你知道我是谁 ?

Larry Wall 简单回答: 湖南的 formalin15


为什么会这样?不知道说什么好,你知道吗?

这是一个很好的问题, 我心里想

回复 9# atgc


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP