免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: chenjintao_ii
打印 上一主题 下一主题

perl输出系统错误码 [复制链接]

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
11 [报告]
发表于 2013-01-15 13:34 |只看该作者
$! 是有魔法的,你想让它是数字它就是数字想是字符串就是字符串)

printf("%d\n", $!) and die "open error: $!\n";
前面 %d 说明你想要数字所以得到 2, 后面的变量内插相当于字符串连接得到的就是字符串形式。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
12 [报告]
发表于 2013-01-15 13:37 |只看该作者
  1. for (1 .. 20) {
  2.     $! = $_;
  3.     printf "%d => %s\n", $!, $!;
  4. }
复制代码

论坛徽章:
0
13 [报告]
发表于 2013-01-15 14:18 |只看该作者
@zhlong8cool

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
14 [报告]
发表于 2013-01-17 09:44 |只看该作者
zhlong8 发表于 2013-01-15 09:34
$! 是有魔法的,你想让它是数字它就是数字想是字符串就是字符串

printf("%d\n", $!) and die "open e ...

$!
除此之外?
还有别的魔法变量?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
15 [报告]
发表于 2013-01-17 10:24 |只看该作者
回复 14# rubyish


    所有特殊变量都带有不同的“魔法”啊,要不它们怎么叫特殊变量呢。这里你理解成 Scalar::Util::dualvar 就行了,同时具有字符串数字两个状态。

(Perl 的魔法指的是在基本的操作时额外的副作用,类似于 tie。比如 $| 在赋值时同时会修改句柄的 autoflush 属性,对 $! 赋值数字同时会查询对应的错误信息)

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
16 [报告]
发表于 2013-01-17 10:34 |只看该作者
我把20改成100,里面各种错误信息{:3_189:}
太魔法了

论坛徽章:
0
17 [报告]
发表于 2013-01-17 12:54 |只看该作者
回复 15# zhlong8


for (1 .. 2) {
        $! = $_;
        $str = $!;
        printf " \$!: %d => %s\n", $!, $!;
        printf " \$str: %d => %s\n", $str, $str;
}

输出:
$!: 1 => Operation not permitted
$str: 1 => Operation not permitted
$!: 2 => No such file or directory
$str: 2 => No such file or directory

这个时候$str也变成了一个特殊变量?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
18 [报告]
发表于 2013-01-17 13:17 |只看该作者
回复 17# chenjintao_ii


    只是普通的复制,魔法并没有复制过来。Perl 的 scalar 可以同时有 整数、浮点数、字符串 三种状态,复制过来的 $str 只是把 $! 的整数、字符串两种状态同时复制过来而已。可以查看下 Scalar::Util 的 dualvar 函数。

scalar 结构可以理解为
struct {
    /* reference count and others */
    bool int_ok, double_ok, string_ok;
    int IV;
    double NV;
    char* PV;
};

如果 int_ok 为真,那在需要整数的操作时就直接用 IV slot 的值,同理 double_ok string_ok 这两个标志位对应浮点数和字符串。如果只有 string_ok 而需要整数时会用 atoi 把 PV 转换成整数放到 IV 这个 slot 里面,然后把 int_ok 设为真。

正常情况下这三个 slot 的关系是对应的, 比如 ”1.1" 对应 NV=1.1; IV = 1。如果是对应关系 Perl 会自动帮你转换,不对应就需要自己手动构建并设置那三个标志位,出来的就是 $! 这种看来很奇怪的值,字符串和数字毫不相干。

论坛徽章:
0
19 [报告]
发表于 2013-01-17 13:33 |只看该作者
回复 18# zhlong8


struct {
    /* reference count and others */
    bool int_ok, double_ok, string_ok;
    int IV;
    double NV;
    char* PV;
};   
一般的scalar,在IV、NV、PV三个slot中只有一个有值(比如IV有值,其他两个为空),当用户需要将这个scalar以字符串形式输出时,会itoa(IV)将整型转化为字符串。
你说的“魔法”就是特殊变量的IV、NV、PV三个slot都有值,根据用户需求输出相应类型的值。
是这样吗?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
20 [报告]
发表于 2013-01-17 13:40 |只看该作者
回复 19# chenjintao_ii


    不对,scalar 这三个slot 本来是为了缓存而存在的,对于一个只有 string_ok 的 scalar 向它索取整数值会自动转换然后它就有了 int_ok 和 string_ok 两个状态,而赋值会使缓存失效。

魔法指的是你给 $! 赋值一个整数它本来应该只有 int_ok 这一项,魔法帮你查询到对应的错误信息并设置 string_ok。正常情况下应该是把那个数字自动转成字符串才对。我讲内部实现主要是解释 $str 为什么也有两种不同状态。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP