Chinaunix

标题: 关于Perl中的版本号的问题 [打印本页]

作者: plpm    时间: 2017-01-03 22:50
标题: 关于Perl中的版本号的问题
首先看下Perl解释器的版本,  是5.22.0,

This is perl 5, version 22, subversion 0 (v5.22.0)
hread-64int



但是我又从书上看说,可以使用 use 5.012; 这样可以使用say函数(带有换行,比print方便)以及自动启动严格语法检查。

但是我有个疑问,5.22.0和5.012到底哪个大,如果5.22大的话,为什么没有自动开启 say函数。

还有关于 use 版本号; 这种语法哪有使用说明。

先谢谢大家了。

作者: MMMIX    时间: 2017-01-04 10:58
回复 1# plpm

还有关于 use 版本号; 这种语法哪有使用说明。


perldoc -f use

作者: zhlong8    时间: 2017-01-04 15:24
perl 的版本是3位的,在脚本里保证没有歧义的话版本号要么写成3段的 5.22.0, 5.22.1 ..这叫 vstring 是一种特别的字符串。要么写成数字 5.022,5.022000, 5.022001 之类的。
作者: sunzhiguolu    时间: 2017-01-04 15:29
回复 3# zhlong8
但是我有个疑问,5.22.0和5.012到底哪个大,如果5.22大的话,为什么没有自动开启 say函数。
版主大神 楼主问的是这个。。。



作者: MMMIX    时间: 2017-01-04 15:35
sunzhiguolu 发表于 2017-01-04 15:29
回复 3# zhlong8
版主大神 楼主问的是这个。。。



没有代码,现象,重现步骤,其他人哪知道他到底把什么搞错了?

作者: sunzhiguolu    时间: 2017-01-04 15:56
回复 5# MMMIX
首先看下Perl解释器的版本,  是5.22.0,

This is perl 5, version 22, subversion 0 (v5.22.0)
hread-64int



但是我又从书上看说,可以使用 use 5.012; 这样可以使用say函数(带有换行,比print方便)以及自动启动严格语法检查。

但是我有个疑问,5.22.0和5.012到底哪个大,如果5.22大的话,为什么没有自动开启 say函数

还有关于 use 版本号; 这种语法哪有使用说明。


版主大神 您老人家理解错了。。。。


作者: laputa73    时间: 2017-01-04 17:03
虽然,5.22>5.12,但是say这个功能仍然属于feature,没有默认开启
需要use 5.010 以上才可以使用
perldoc feature
作者: MMMIX    时间: 2017-01-04 20:18
回复 7# laputa73

5.10 就默认开启了 say 了。
作者: zhlong8    时间: 2017-01-04 21:02
给个例子或错误提示,不管是 use 5.22.0; 还是 use 5.022; 都可以用 say 的。

版本号这个初学者容易搞混所以我就说这个啊。“不能用 say” 这个肯定是楼主自己的问题,估计楼主瞎猜原因呢就找到版本号这个问题上了
作者: laputa73    时间: 2017-01-05 18:57
回复 8# MMMIX


咦,我的5.20也没有啊。
-bash-4.1$ perl -v
This is perl 5, version 20, subversion 1 (v5.20.1) built for x86_64-linux
Copyright 1987-2014, Larry Wall

-bash-4.1$ perl tsay.pl
String found where operator expected at tsay.pl line 2, near "say "hello.\n""
        (Do you need to predeclare say?)
syntax error at tsay.pl line 2, near "say "hello.\n""
Execution of tsay.pl aborted due to compilation errors.
-bash-4.1$ cat tsay.pl
#use  5.010;
say "hello.\n";
-bash-4.1$

作者: zhlong8    时间: 2017-01-05 20:45
简直酷炫,盲人程序员
作者: laputa73    时间: 2017-01-06 09:06
回复 11# zhlong8


不懂
是说注释了吗?

  1. <P> </P>
复制代码

但是LZ问的就是默认开启。而不是需要use啊。
前面@MMMIX说的也是默认开启。

作者: jason680    时间: 2017-01-06 10:38
回复 12# laputa73

compatible issue

$ cat say.pl

sub say{
  print "say:@_\n";
}

say "123";

$ perl say.pl
say:123

$ perl -M5.010 say.pl
123


作者: MMMIX    时间: 2017-01-06 14:01
回复 12# laputa73

你完全把我的话弄拧了。我说 say 在 5.10 就默认开启的意思是当你通过 use 指定需要至少 5.10 版本 Perl 的时候,就不需要再通过额外的 use feature 来打开 say 支持了;而不是说只要你用了 5.10 以上版本的 perl 解释器,它支持的所有特性就默认打开了。


出于兼容性考虑,默认情况下的 perl 的行为是非常保守的。


作者: zhlong8    时间: 2017-01-06 15:56
1.新版本的功能老版本的解释器可能无法使用,严格起见必须声明代码正确运行需要的版本。Perl 保证兼容旧代码,所以声明需要的最低版本就行了。
2.新的关键字可能会破坏旧代码的语义,特别是 Perl 开始设计时非常随意。
  比如旧代码想用字符串时甚至可以不加引号 比如 perl -e "print 1,say"。保证旧代码语义,那就不能加新关键字。为了发展语言就只能让使用者保证:我知道这些关键字,保证不乱用。
作者: zhlong8    时间: 2017-01-06 15:58
我举的这个例子1995年之后就不应该这么用了,别拿这个说事。
作者: sunzhiguolu    时间: 2017-01-06 16:38
大神来了不少 楼主可以出来说一下你想问的问题了。。。
作者: sditmaner    时间: 2017-01-06 20:12
回复 3# zhlong8
作者: laputa73    时间: 2017-01-09 08:31
涨姿势了
以前对这个版本号还真没特殊关注过。
一直默认过来的。
默认这个词确实是有歧义的。

作者: plpm    时间: 2017-02-08 22:08
好久没来,没想到看到这么多热心人的回答。我首先感谢大家以及版主的精彩回答了。
其次,我通过阅读了大家的回答以及perl内置的文档说明后,简单小结了下。
1. perl的版本号是三位的,并且是数字的,版本号10全称就是010(加了个前导0),那么5.22就是5.022。 (详见#3楼)
2. 关于use的语法有多种使用方式,(详见perldoc -f use)
  1. use v5.6.1;     # compile time version check
  2. use 5.6.1;      # ditto
  3. use 5.006_001;  # ditto; preferred for backwards compatibility
复制代码


我自己试了下,use 5.22.0, use 5.022, use 5.017.11 都是可以使用say的。可见,use的版本号只要不大于当前安装的perl版本号即可
3. say是一种feature,并且是Perl 6的。所以它默认在任何的Perl 5编译器下,都是不能识别的。
4. 除了say,perl还提供了很多个feature,比如,state, switch, unicode_strings等等。
开启feature的方法,以switch为例:use feature 'switch'
为了方便,perl将不同的feature进行分组,提供了多个feature组。(参考 perldoc feature)
例如,use 5.010; 就会开启 say state switch array_base 这几个feature

bundle    features included
--------- -----------------
:default  array_base

:5.10     say state switch array_base

:5.12     say state switch unicode_strings array_base

:5.14     say state switch unicode_strings array_base

:5.16     say state switch unicode_strings
          unicode_eval evalbytes current_sub fc

:5.18     say state switch unicode_strings
          unicode_eval evalbytes current_sub fc

:5.20     say state switch unicode_strings
          unicode_eval evalbytes current_sub fc

:5.22     say state switch unicode_strings
作者: plpm    时间: 2017-02-08 22:12
MMMIX 发表于 2017-01-04 20:18
回复 7# laputa73

5.10 就默认开启了 say 了。

是的。的确是这样。
作者: plpm    时间: 2017-02-08 22:13
zhlong8 发表于 2017-01-04 21:02
给个例子或错误提示,不管是 use 5.22.0; 还是 use 5.022; 都可以用 say 的。

版本号这个初学者容易搞混 ...

对的。perl太灵活了。

作者: plpm    时间: 2017-02-08 22:14
laputa73 发表于 2017-01-05 18:57
回复 8# MMMIX

你貌似注释了。
作者: laputa73    时间: 2017-02-10 09:24
回复 23# plpm
我的本意就是说,不注释才行,注释了就不管用了。
前面解释过了,只是对默认这个词理解不同。

ps. 5.24以后coro模块就编不过了,有人遇到过么?



作者: zhlong8    时间: 2017-02-10 10:03
回复 24# laputa73

没用过,不过你可以看下是不是这个原因,里面有补丁。 https://rt.cpan.org/Public/Bug/Display.html?id=114708
作者: laputa73    时间: 2017-02-10 20:06
回复 25# zhlong8


谢谢版主。这个看到了,不过还没来得及试。
要临时装个perl5.24.






欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2