-
从最近来看,出现了大量新的编程语言。硬件性能提高是一个原因,这就允许工程师根据使用目的在运行速度和编程便利性之间做出不同的取舍。如果这就是未来的趋势,那么100年后强大的硬件只会使得语言数目变得更多。目前,性能分析并没有受到重视。许多人仍然相信,程序运行速度提升的关键在于开发出能够生成更快速的代码的编译器。代码效率与机器性能的差距正在不断加大,我们将会越来越清楚地看到,应用软件运行速度提升的关键在于有一个好的性能分析器帮助指导程序开发。过去10年最激动人心的趋势之一就是开源语言的崛起,比如Perl、Python和Ruby。到目前为止这样到底是好是坏还看不清楚,但是发展势头令人鼓舞。比如,Perl就有一些绝妙的创新。以它现在这种变化的速率,大概只有上帝才知道一百年后Perl会变成什么样。新语言更多地以开源项目的形式出现,而不是以研究性项目的形式出现。这是语言的一种发展趋势。而另一种发展趋势是,新语言的设计者更多的是本身就需要使用它们的应用软件作者,而不是编译器作者。这似乎是好的趋势。设计新语言的方法之一就是直接写下你想写的程序,不管编译器是否存在,也不管有没有支持它的硬件。这就是假设存在无限的资源供你支配。不管是今天还是100年后,这样的假设好像都是有道理的。你应该写什么程序?随便什么,只要能让你最省力地写出来就行。但是要注意,这必须是在你的思维没有被当前使用的编程语言影响的情况下。
-
前言把以前一直只限于知道,却不清晰理解的这几个概念完完整整地梳理了一番。内容参考自wiki页面,然后加上自己一些理解。词法作用域和动态作用域不管什么语言,我们总要学习作用域(或生命周期)的概念,比如常见的称呼:全局变量、包变量、模块变量、本地变量、局部变量等等。不管如何称呼这些作用域的范围,实现它们的目的都一样:(1)为了避免名称冲突;(2)为了限定变量的生命周期(本文以变量名说事,其它的名称在规则上是一样的)。但是不同语言的作用域规则不一样,虽然学个简单的基础就足够应用,因为我们有编程规范:(1)尽量避免名称冲突;(2)加上类似于local的修饰符尽量缩小生效范围;(3)放进代码块,等等。但是真正去细心验证作用域的生效机制却并非易事(我学Python的时候,花了很长时间细细验证,学perl的时候又花了很长时间细细验证),但可以肯定的是,理解本文的词法作用域规则(Lexical scoping)和动态作用域规则(dynamic scoping),对学习任何语言的作用域规则都有很大帮助,这两个规则是各种语言都宏观通用的。很简单的一段bash下的代码:12345x=1function g(){ echo "g: $x" ; x=2; }function f(){ local x=3 ; g; echo "f: $x"; } # 输出2还是3f # 输出1还是3?echo $x # 输出1还是2?对于bash来说,上面输出的分别是3(g函数中echo)、2(f函数中的echo)和1(最后一行echo)。但是同样语义的代码在其它语言下得到的结果可能就不一样(分别输出1、3和2,例如perl中将local替换为my)。这牵扯到两种贯穿所有程序语言的作用域概念:词法作用域(类似于C语言中static)和动态作用域。词法作用域和"词法"这个词真的没什么关系,反而更应该称之为"文本段作用域"。要区别它们,只需要回答"函数out_func中嵌套的内层函数in_func能否看见out_func中的环境"。对于上面的bash代码来说,假如这段代码是适用于所有语言的伪代码:对于词法作用域的语言,执行f时会调用g,g将无法访问f文本段的变量,词法作用域认为g并不是f的一部分,而是跳出f的,因为g的定义文本段是在全局范围内的,所以它是全局文本段的一部分。如果函数g的定义文本段是在f内部,则g属于f文本段的一部分。所以g不知道f文本段中local x=3的设置,于是g的echo会输出全局变量x=1,然后设置x=2,因为它没有加上作用域修饰符,而g又是全局内的函数,所以x将修改全局作用域的x值,使得最后的echo输出2,而f中的echo则输出它自己文本段中的local x=3。所以整个流程输出1 3 2对于动态作用域的语言,执行f时会调用g,g将可以访问f文本中的变量,动态作用域认为g是f文本段的一部分,是f中的嵌套函数。所以g能看到local x=3的设置,所以g的echo会输出3。g中设置x=2后,仅仅只是在f的内层嵌套函数中设置,所以x=2对g文本段和f文本段(因为g是f的一部分)都可见,但对f文本段外部不可见,所以f中的echo输出2,最后一行的echo输出1。所以整个流程输出3 2 1总结来说:词法作用域是关联在编译期间的,对于函数来说就是函数的定义文本段的位置决定这个函数所属的范围。动态作用域是关联在程序执行期间的,对于函数来说就是函数执行的位置决定这个函数所属的范围。由于bash实现的是动态作用域规则。所以,输出的是3 2 1。对于perl来说,my修饰符实现词法作用域规则,local修饰符实现动态作用域规则。例如,使用my修饰符的perl程序:1234567#!/usr/bin/perl $x=1;sub g { print "g: $x\n"; $x=2; }sub f { my $x=3; g(); print "f: $x\n"; } # 词法作用域f(); print "$x\n";执行结果:[fairy@fairy:/perlapp]$ perl scope2.plg: 1f: 32使用local修饰符的perl程序:1234567#!/usr/bin/perl $x=1;sub g { print "g: $x\n"; $x=2; }sub f { local $x=3; g(); print "f: $x\n"; } # 动态作用域f(); print "$x\n";执行结果:[fairy@fairy:/perlapp]$ perl scope2.plg: 3f: 21有些语言只支持一种作用域规则,特别是那些比较现代化的语言,而有些语言支持两种作用域规则(正如perl语言,my实现词法变量作用域规则,local实现动态作用域规则)。相对来说,词法作用域规则比较好控制整个流程,还能借此实现更丰富的功能(如最典型的"闭包"以及高阶函数),而动态作用域由于让变量生命周期"没有任何深度"(回想一下shell脚本对函数和作用域的控制,非常傻瓜化),比较少应用上,甚至有些语言根本不支持动态作用域。闭包和回调函数理解闭包、回调函数不可不知的术语1.引用(reference):数据对象和它们的名称前文所说的可见、不可见、变量是否存在等概念,都是针对变量名(或其它名称,如函数名、列表名、hash名)而言的,和变量的值无关。名称和值的关系是引用(或指向)关系,赋值的行为就是将值所在的数据对象的引用(指针)交给名称,让名称指向这个内存中的这个数据值对象。如下图:2.一级函数(first-class functions)和高阶函数(high-order functions)有些语言认为函数就是一种类型,称之为函数类型,就像变量一样。这种类型的语言可以:将函数赋值给某个变量,那么这个变量就是这个函数体的另一个引用,就像是第二个函数名称一样。通过这个函数引用变量,可以找到函数体,然后调用执行。例如perl中$ref_func=\&myfunc表示将函数myfunc的引用赋值给$ref_func,那么$ref_func也指向这个函数。将函数作为另一个函数的参数。例如两个函数名为myfunc和func1,那么myfunc(func1)就将func1作为myfunc的参数。这种行为一般用于myfunc函数中对满足某些逻辑的东西执行func1函数。举个简单的例子,unix下的find命令,将find看作是一个函数,它用于查找指定路径下符合条件的文件名,将-print、-exec {}\;选项实现的功能看作是其它的函数(请无视它是否真的是函数),这些选项对应的函数是find函数的参数,每当find函数找到符合条件的文件名时,就执行-print函数输出这个文件名函数的返回值也可以是另一个函数。例如myfunc函数的定义语句为function myfunc(){ ...return func1 }。其实,实现上面三种功能的函数称之为一级函数或高阶函数,其中高阶函数至少要实现上面的2和3。一级函数和高阶函数并没有区分的必要,但如果一定要区分,那么:一级函数更像是一种术语概念,它将函数当作一种值看待,可以将其赋值出去、作为参数传递出去以及作为返回值,对于计算机程序语言而言,它更多的是用来描述某种语言是否支持一级函数;高阶函数是一种函数类型,就像回调函数一样,当某个函数符合高阶函数的特性,就可以将其称之为这是一个高阶函数。3.自由变量(free variable)和约束变量(bound variable)这是一组数学界的术语。在计算机程序语言中,自由变量是指函数中的一种特殊变量,这种变量既不在本函数中定义,也不是本函数的参数。换句话说,可能是外层函数中定义的但却在内层函数中使用的,所以自由变量常常和"非本地变量"(non-local variable,熟悉Python的人肯定知道)互用。例如:1234567function func1(x){ var z; function func2(y){ return x+y+z # x和z既不是func2内部定义的,也不是func2的参数,所以x和z都是自由变量 } return func1}自由变量和约束变量对应。所谓约束变量,是指这个变量之前是自由变量,但之后会对它进行赋值,将自由变量绑定到一个值上之后,这个变量就成为约束变量或者称为绑定变量。例如:1234567891011function func1(x){ var m=20 # 对func2来说,这是自由变量,对其赋值,所以m变成了bound variable var z function func2(y){ z=10 # 对自由变量z赋值,z变成bound variable return m+x+y+z # m、x和z都是自由变量 } return func1} ref_func=func1(3) # 对x赋值,x变成bound variable回调函数回调函数一开始是C里面的概念,它表示的是一个函数:可以访问另一个函数当这个函数执行完了,会执行另一个函数也就是说,将一个函数(B)作为参数传递给另一个函数(A),但A执行完后,再自动调用B。所以这种回调函数的概念也称为"call after"。但是现在回调函数已经足够通用化了。通用化的回调函数定义为:将函数B作为另一个函数A的参数,执行到函数A中某个地方的时候去调用B。和原来的概念相比,不再是函数A结束后再调用,而是我们自己定义在哪个地方调用。例如,Perl中的File::Find模块中的find函数,通过这个函数加上回调函数,可以实现和unix find命令相同的功能。例如,搜索某个目录下的文件,然后print输出这个文件名,即find /path xxx -print。12345678910#!/usr/bin/perluse File::Find; sub print_path { # 定义一个函数,用于输出路径名称 print "$File::Find::name\n";} $callback = \&print_path; # 创建一个函数引用,名为$callback,所以perl是一种支持一级函数的语言 find( $callback,"/tmp" ); # 查找/tmp下的文件,每查找到一个文件,就执行一次$callback函数这里传递给find函数的$callback就是一个回调函数。几个关键点:$callback作为参数传递给另一个find()函数(所以find()函数是一个高阶函数)在find()函数中,每查找到一个文件,就调用一次这个$callback函数。当然,如果find是我们自己写的程序,就可以由我们自己定义在什么地方去调用$callback$callback不是我们主动调用的,而是由find()函数在某些情况下(每查找到一个文件)去调用的回调就像对函数进行填空答题一样,根据我们填入的内容去复用填入的函数从而实现某一方面的细节,而普通函数则是定义了就只能机械式地复用函数本身。之所以称为回调函数,是因为这个函数并非由我们主观地、直接地去调用,而是将函数作为一个参数,通过被调用者间接去调用这个函数参数。本质上,回调函数和一般的函数没有什么区别,可能只是因为我们定义一个函数,却从来没有直接调用它,这一点感觉上有点奇怪,所以有人称之为"回调函数",用来统称这种间接的调用关系。回调函数可以被多线程异步执行。彻底搞懂闭包计算机中的闭包概念是从数学世界引入的,在计算机程序语言中,它也称为词法闭包、函数闭包。闭包简单的、通用的定义是指:函数引用一个词法变量,在函数或语句块结束后(变量的名称消失),词法变量仍然对引用它的函数有效。在下一节还有关于闭包更严格的定义(来自wiki)。看一个python示例:函数f中嵌套了函数g,并返回函数g12345678910111213def f(x): def g(y): return x + y return g # 返回一个闭包:有名称的函数(高阶函数的特性) # 将执行函数时返回的闭包函数赋值给变量(高阶函数的特性)a = f(1) # 调用存储在变量中闭包函数print (a(5)) # 无需将闭包存储进临时变量,直接一次性调用闭包函数print( f(1)(5) ) # f(1)是闭包函数,因为没有将其赋值给变量,所以f(1)称为"匿名闭包"上面的a是一个闭包,它是函数g()的一个实例。f()的参数x可以被g访问,在f()返回g函数后,f()就退出了,随之消失的是变量名x(注意是变量名称x,变量的值在这里还不一定会消失)。当将闭包f(1)赋值给a后,原来x指向的数据对象(即数值1)仍被a指向的闭包函数引用着,所以x对应的值1在x消失后仍保存在内存中,只有当名为a的闭包被消除后,原来x指向的数值1才会消失。闭包特性1:对于返回的每个闭包g()来说,不同的g()引用不同的x对应的数据对象。换句话说,变量x对应的数据对象对每个闭包来说都是相互独立的例如下面得到两个闭包,这两个闭包中持有的自由变量虽然都引用相等的数值1,但两个数值是不同数据对象,这两个闭包也是相互独立的:12a=f(1)b=f(1)闭包特性2:对于某个闭包函数来说,只要这不是一个匿名闭包,那么闭包函数可以一直访问x对应的数据对象,即使名称x已经消失但是12345a=f(1) # 有名称的闭包a,将一直引用数值对象1a(3) # 调用闭包函数a,将返回1+3=4,其中1是被a引用着的对象,即使a(3)执行完了也不放开a(3) # 再次调用函数a,将返回4,其中1和上面一条语句的1是同一个数据对象f(1)(3) # 调用匿名的闭包函数,数据对象1在f(1)(3)执行完就消失f(1)(3) # 调用匿名的闭包函数,和上面的匿名闭包是相互独立的最重要的特性就在于上面执行的两次a(3):将词法变量的生命周期延长,但却足够安全。看下面perl程序中的闭包函数,可以更直观地看到结果。1234567891011sub how_many { # 定义函数 my $count=2; # 词法变量$count return sub {print ++$count,"\n"}; # 返回一个匿名函数,这是一个匿名闭包} $ref=how_many(); # 将闭包赋值给变量$ref how_many()->(); # (1)调用匿名闭包:输出3how_many()->(); # (2)调用匿名闭包:输出3$ref->(); # (3)调用命名闭包:输出3$ref->(); # (4)再次调用命名闭包:输出4上面将闭包赋值给$ref,通过$ref去调用这个闭包,则即使how_many中的$count在how_many()执行完就消失了,但$ref指向的闭包函数仍然在引用这个变量,所以多次调用$ref会不断修改$count的值,所以上面(3)和(4)先输出3,然后输出改变后的4。而上面(1)和(2)的输出都是3,因为两个how_many()函数返回的是独立的匿名闭包,在语句执行完后数据对象3就消失了。闭包更严格的定义注意,严格定义的闭包和前面通俗定义的闭包结果上是不一样的,通俗意义上的闭包并不一定符合严格意义上的闭包。关于闭包更严格的定义,是一段谁都看不懂的说明(来自wiki)。如下,几个关键词我加粗显示了,因为重要。闭包是一种在支持一级函的编程语言中能够将词法作用域中的变量名称进行绑定的技术。在操作上,闭包是一种用于保存函数和环境的记录。这个环境记录了一些关联性的映射,将函数的每个自由变量与创建闭包时所绑定名称的值或引用相关联。通过闭包,就算是在作用域外部调用函数,也允许函数通过闭包拷贝他们的值或通过引用的方式去访问那些已经被捕获的变量。我知道这段话谁都看不懂,所以简而言之一下:一个函数实例和一个环境结合起来就是闭包。这个所谓的环境,决定了这个函数的特殊性,决定了闭包的特性。还是上面的python示例:函数f中嵌套了函数g,并返回函数g1234567def f(x): def g(y): return x + y return g # 返回一个闭包:有名称的函数 # 将执行函数时返回的闭包函数赋值给变量a = f(1)上面的a是一个闭包,它是函数g()的一个实例。f()的参数x可以被g访问,对于g()来说,这个x不是g()内部定义的,也不是g()的参数,所以这个x对于g来说是一个自由变量(free variable)。虽然g()中持有了自由变量,但是g()函数自身不是闭包函数,只有在g持有的自由变量x和传递给f()函数的x的值(即f(1)中的1)进行绑定的时候,才会从g()创建一个闭包函数,这表示闭包函数开始引用这个自由变量,并且这个闭包一直持有这个变量的引用,即使f()已经执行完毕了。然后在f()中return这个闭包函数,因为这个闭包函数绑定了(引用)自由变量x,这就是闭包函数所在的环境。环境对闭包来说非常重要,是区别普通函数和闭包的关键。如果返回的每个闭包不是独立持有属于自己的自由变量,而是所有闭包都持有完全相同的自由变量,那么闭包虽然仍可称为闭包,但和普通函数却没有区别了。例如:12345678def f(x): x=3 def g(y): return x + y return g a = f(1)b = f(3)在上面的示例中,x虽然是自由变量,但却在g()的定义之前就绑定了值(前文介绍过,它称为bound variable),使得闭包a和闭包b持有的不再是自由变量,而是值对象完全相同的绑定变量,其值对象为3,a和b这个时候其实没有任何区别(虽然它们是不同对象)。换句话说,有了闭包a就完全没有必要再定义另一个功能上完全相同的闭包b。在函数复用性的角度上来说,这里的a和普通函数没有任何区别,都只是简单地复用了函数体。而真正严格意义上的闭包,除了复用函数体,还复用它所在的环境。但是这样一种情况,对于通俗定义的闭包来说,返回的g()也是一个闭包,但在严格定义的闭包中,这已经不算是闭包。再看一个示例:将自由变量x放在g()函数定义文本段的后面。12345678910def f(y): return x+y x=1 def g(z): x=3 return f(z) print(g(1)) # 输出2,而不是4首先要说明的是,python在没有给任何作用域修饰符的时候实现的词法作用域规则,所以上面return f(z)中的f()看见的是全局变量x(因为f()定义在全局文本段中),而不是g()中的x=3。回到闭包问题上。上面f()持有一个自由变量x,这个f(z)的文本定义段是在全局文本段中,它绑定的自由变量x是全局变量(声明并初始化为空或0),但是这个变量之后赋值为1了。对于g()中返回的每个f()所在的环境来说,它持有的自由变量x一开始都是不确定的,但是后来都确定为1了。这种情况也不能称之为闭包,因为闭包是在f()对自由变量进行绑定时创建的,而这个时候x已经是固定的值对象了。回调函数、闭包和匿名函数回调函数、闭包和匿名函数其实没有必然的关系,但因为很多书上都将匿名函数和回调函数、闭包放在一起解释,让人误以为回调函数、闭包需要通过匿名函数实现。实际上,匿名函数只是一个有函数定义文本段,却没有名称的函数,而闭包则是一个函数的实例加上一个环境(严格意义上的定义)。对于闭包和匿名函数来说,仍然以python为例:123456789101112131415def f(x): def g(y): return x + y return g # 返回一个闭包:有名称的函数 def h(x): return lambda y: x + y # 返回一个闭包:匿名函数 # 将执行函数时返回的闭包函数赋值给变量a = f(1)b = h(1) # 调用存储在变量中闭包函数print (a(5))print (b(5))对于回调函数和匿名函数来说,仍然以perl的find函数为例:12345678#!/usr/bin/perluse File::Find; $callback = sub { print "$File::Find::name\n";}; # 创建一个匿名函数以及它的引用 find( $callback,"/tmp" ); # 查找/tmp下的文件,每查找到一个文件,就执行一次$callback函数匿名函数让闭包的实现更简洁,所以很多时候返回的闭包函数就是一个匿名函数实例。https://www.jb51.net/article/152433.htm
-
1.1 介绍Circos是使用Perl语言编写,采用GPL许可,可以运行于任何有Perl语言解释器的操作系统(如Windows、Mac OS X、Linux及其他类UNIX系统)的免费软件。它可以轻易地根据纯文本的配置文件,将用户的输入数据转化为像素图片(PNG)或矢量图片(SVG)。最初主要用于基因组序列相关数据的可视化,目前已应用于多个领域,如影视作品中的人物关系分析,物流公司的订单来源和流向分析等。大多数关系型数据都可以尝试用Circos来可视化。关于Circos的更多信息请访问Circos官网。语言:Perl。一句话描述:Circos是可以运行于任何有Perl语言解释器的操作系统(如Windows、Mac OS X、Linux及其他类UNIX系统)的免费软件。开源协议:GPL。建议的版本建议使用的版本为“Circos0.69-9”。1.2 环境要求硬件要求硬件要求如表1-1所示。表1-1 硬件要求项目说明CPU鲲鹏920处理器。 软件要求软件要求如表1-2所示。表1-2 软件要求项目版本下载地址Perl5.34https://www.cpan.org/src/5.0/perl-5.34.0.tar.gzxz5.25https://nchc.dl.sourceforge.net/project/lzmautils/xz-5.2.5.tar.gzgdlib2.25https://codeload.github.com/libgd/libgd/zip/refs/tags/gd-2.2.5 操作系统要求操作系统要求如表1-3所示。表1-3 操作系统要求项目版本下载地址CentOS8.2https://vault.centos.org/8.2.2004/isos/aarch64/ 1.3 移植规划数据本章节给出Circos软件在移植过程中涉及到的相关软件安装规划路径的用途及详细说明。表1-4 移植规划数据序号软件安装规划路径用途说明1-基础环境搭建中的各安装包安装路径。参考《HPC解决方案 基础环境搭建指导书》中“集群场景环境搭建”章节。2/path/to/perl/Circos的依赖库Perl安装规划路径。这里的安装规划路径只是一个举例说明,建议部署在共享路径中。现网需要根据实际情况调整,后续章节凡是遇到安装路径的命令,都以现网实际规划的安装路径为准进行替换,不再单独说明。3/path/to/circosCircos安装规划路径。 1.4 配置编译环境前提条件使用SFTP工具将各安装包上传至服务器对应目录下。配置流程表1-5 配置流程序号配置项说明1基础环境搭建参考《HPC解决方案 基础环境搭建指导书》中“集群场景环境搭建”章节。2安装Perl参考1.4.1 安装Perl。3安装libgd参考1.4.2 安装libgd。4安装GD参考1.4.3 安装GD。 1.4.1 安装Perl操作步骤步骤 1 使用PuTTY工具,以root用户登录服务器。步骤 2 使用“cd”命令进入安装包上传位置。步骤 3 执行以下命令解压安装包。tar -zxvf perl-5.34.0.tar.gz步骤 4 执行以下命令进入解压后文件。cd perl-5.34.0步骤 5 执行以下命令进行编译安装。./Configure -des -Dprefix=/path/to/perl/perl-5.34.0/ -Dusethreads -Uinstalluserbinperl -Dcc=gccmakemake testmake install步骤 6 执行以下命令更新环境变量。export PERL5LIB=/path/to/perl/perl-5.34.0/libexport PATH=/path/to/perl/perl-5.34.0/bin:$PATH步骤 7 执行以下命令确认是否安装成功。perl -version回显包含对应版本号表示安装成功。----结束1.4.2 安装libgd操作步骤步骤 1 使用PuTTY工具,以root用户登录服务器。步骤 2 使用“cd”命令进入安装包上传位置。步骤 3 执行以下命令解压。unzip gd-2.2.5.zip步骤 4 执行以下命令进入解压后文件。cd libgd-gd-2.2.5步骤 5 执行以下命令编译安装。./bootstrap.sh./configure --enable-sharedmakemake install步骤 6 执行以下命令确认是否安装成功。gdlib-config --version回显内容包含对应版本号表示安装成功。----结束1.4.3 安装GD操作步骤步骤 1 使用PuTTY工具,以root用户登录服务器。步骤 2 执行以下命令安装。yum -y install perl-CPAN步骤 3 第一次使用CPAN安装,默认自动配置就可以。cpan -i GD----结束1.5 获取源码操作步骤步骤 1 下载Circos安装包。下载地址:http://circos.ca/distribution/circos-0.69-9.tgz步骤 2 使用SFTP工具将Circos安装包上传至服务器“/path/to/circos”目录。----结束1.6 编译和安装操作步骤步骤 1 使用PuTTY工具,以root用户登录服务器。步骤 2 执行以下命令进入主程序安装目录。cd /path/to/circos步骤 3 执行以下命令解压安装包。tar -zxvf circos-0.69-9.tgz步骤 4 执行以下命令安装所需perl模块。cd circos-0.69-9/bin步骤 5 执行以下命令列出Circos所需求的Perl模块。./list.modules步骤 6 执行以下命令检测这些所需求的Perl模块是否正确安装。./test.modules步骤 7 务必先顺序执行一次。./circus -modules步骤 8 对未安装的模块逐一安装,以安装Carp为例。cpan install Carp----结束1.7 运行和验证操作步骤步骤 1 运行一个例子。cd /path/to /circos/circos-0.69-9/example/rm -rf *.svg *.png../bin/circos -conf ./etc/circos.conf在Windows下查看当前目录生成的png和svg文件。----结束
-
【功能模块】【操作步骤&问题现象】1、通过Perl脚本连接到DWS,通过DBI->fetchrow()返回数据,查询的字段字符串如果长度超81,就会返回空值,在data studio中查询返回是正常的【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
【功能模块】【操作步骤&问题现象】1、编译安装Mail-SpamAssassin-3.4.6,已执行① wget https://mirrors.tuna.tsinghua.edu.cn/apache//spamassassin/source/Mail-SpamAssassin-3.4.6.tar.gz ② tar -xvzf Mail-SpamAssassin-3.4.6.tar.gz ③ cd Mail-SpamAssassin-3.4.6 ④ yum -y install perl-Digest-MD5 yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker2、执行 perl Makefile.PL 报错,参考文档 https://blog.csdn.net/sdfshfh/article/details/86701334【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
百度和google查了下,说是perl功能异常导致的,是不是exagear模式下perl不可用的?
-
摘要】 本文介绍使用perl通过ODBC连接GaussDB(DWS)的安装和配置方法使用perl语言连接Gaussdb1 准备本例使用软件如下unixODBC-2.3.0DBI-1.642DBD-ODBC-1.562 安装unixODBC2.1 上传安装包使用root用户上传安装包unixODBC-2.3.0.tar.gz到/tmp下2.2 安装使用root用户安装,执行如下命令cd /tmptar zxvf unixODBC-2.3.0.tar.gzcd unixODBC-2.3.0./configure --enable-gui=no(x86编译命令)./configure --enable-gui=no --build=arm-linux(arm编译命令)makemake install2.3 测试安装结果命令行敲击isql,出现如下结果,表示安装成功2.4 替换驱动程序包解压GaussDB-Kernel-V300R002C00-SUSE11-64bit-Odbc.tar.gz包把odbc/lib下的psqlodbcw.la,psqlodbcw.so 这2个文件拷贝到/usr/local/lib路径下。2.5 添加环境变量使用omm用户,编辑~/.bashrc文件,追加红色内容vi ~/.bashrcexport LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATHexport ODBCSYSINI=/usr/local/etcexport ODBCINI=/usr/local/etc/odbc.ini 生效环境变量source ~/.bashrc2.6 配置数据源使用root用户,做如下操作。在“/usr/local/etc/odbcinst.ini”文件中追加以下内容。vi /usr/local/etc/odbcinst.ini[GaussMPP]Driver64=/usr/local/lib/psqlodbcw.sosetup=/usr/local/lib/psqlodbcw.so 在“/usr/local/etc/odbc.ini ”文件中追加以下内容。vi /usr/local/etc/odbc.ini[GaussODBC]Driver=GaussMPPServername=10.185.180.123(数据库Server IP)Database=postgres (数据库名)Username=odbc (数据库用户名)Password=Bigdata123@ (数据库用户密码)Port=25308 (数据库监听端口)Sslmode=allow2.7 配置pg_hba.conf文件gs_guc set -Z coordinator -N all -I all -h "host all all 10.185.180.123/32 sha256"2.8 重启集群source /opt/huawei/Bigdata/mppdb/.mppdbgs_profilecm_ctl stopcm_ctl start2.9 创建odbc配置的用户如果用户已经存在,可以忽略此步。登录CNsource /opt/huawei/Bigdata/mppdb/.mppdbgs_profilegsql -d postgres -p 25308 -arcreate user odbc password 'Bigdata123@';2.10 测试isql -v GaussODBC出现如下结果表示配置成功3 安装DBI3.1 上传安装包使用root用户上传安装包DBI-1.642.tar到/tmp下3.2 安装使用root用户安装,执行如下命令cd /tmptar xvf DBI-1.642.tarcd DBI-1.642perl Makefile.PLmakemake install4 安装DBD-ODBC4.1 上传安装包使用root用户上传安装包DBD-ODBC-1.56.tar.gz到/tmp下4.2 安装使用root用户安装,执行如下命令cd /tmptar zxvf DBD-ODBC-1.56.tar.gzcd DBD-ODBC-1.56perl Makefile.PLmakemake install5 Perl脚本连接数据库脚本:use DBI;my $dbh;$dbh = DBI->connect("dbi:ODBC:GaussODBC","odbc","Bigdata123@",{AutoCommit => 1, PrintError => 1, RaiseError => 0, LongReadLen => 1048576});my $sth = $dbh->prepare("select current_time");$sth ->execute();@tabrow=$sth->fetchrow();$result=@tabrow[0];$sth->finish();$dbh->disconnect();print $result."\n";
-
大小写字母转换:函数 uc (uppercase) 将所有的小写字母转成大写;函数 lc (lowercase) 将所有的大写字母转成小写;Perl提供了四个内置的函数类,从而能够轻松地改变字符和字的大小写。函数uc()会用大写返回其所有的参数,而lc()会用小写返回其参数。如果没有指定参数的话,uc()和lc()都会对$_变量进行操作。要改变字的首字母的大小写,就要使用ucfirst()和lcfirst()。和uc()以及lc()类似,如果没有指定参数,ucfirst()和lcfirst()会对$_变量进行操作。这四个函数都不会改变其参数;它们只是会返回其参数的副本,而这个副本经过了改变。所以,你必须将结果分派给一个变量或者打印它,或者用其他的方式使用返回的值。像下面这样做是一个常见的错误:123$a = 'hello';uc($a);print $a;第一眼看上去,你可能会预计这段代码将打印“HELLO”。但是,由于uc()没有更改其参数,所以它的结果只打印了小写的“hello”。要获得预期的结果,就要使用像下面这样的代码:123$a = 'hello';$a = uc($a);print $a;更改字的大小写的另一种方式,是对双引号里面的字符串使用/L和/U逸出序列。使用下面的代码你可以获得与前面相同的结果:12$a = 'hello';print "/U$a/E";逸出字符/E会结束前面逸出字符(在这里是/U)开始的内容。利用Perl内置的大写和小写函数,以及双引号里的逸出字符/U和/L,改变(字符的)大小写是很容易的。单词首字母大写1$str =~ s/(\w+)/\u$1/在perl中,我们可以通过uc,lc,\U,\L来修改变量的大小写。其中uc,\U是将变量中的字母全部转换为大写,对应的lc和 \L是将变量中的字母全部转换为小写。如果我们只想将变量的首字母大写或将变量的首字母小写,我们可以使用perl提供给我们的另外两个函数 ucfirst和lcfirst来实现,下面我们来看一个具体的例子:123456789101112131415161718#! /usr/bin/perluse strict;use warnings; my $little = "hello";print "little:$little\n";my $big = uc($little);print "big:$big";$little = lc($big);print "little:$little\n";$big = "\U$little";print "big:$little";$little = "\l$big";print "little:$little\n";$big = ucfirst($little);print "big:$little\n";$little = lcfirst($big);print "little:$big\n";上面的这个程序打印的结果如下:helloHELLOhelloHELLohelloHellohello
-
Tty.xs: 在函数‘XS_IO__Tty_unpack_winsize’中:Tty.xs:865:12: 警告:格式 ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘STRLEN {或称 long unsigned int}’ [-Wformat=] croak("IO::Tty::unpack_winsize(): Bad arg length - got %d, expected %d", ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Tty.xs:865:12: 警告:格式 ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘long unsigned int’ [-Wformat=]【操作步骤&问题现象】1、# perl -MCPAN -e shell2、cpan[1]>install IPC::Run 【日志信息】(可选,上传日志内容或者附件)
-
摘自 https://www.oschina.net/news/116711/announcing-perl-7 oschina 发布于 2020年06月25日Perl 官方宣布了 Perl 7 计划。Perl 7 目前已经在开发中,但是在代码与语法上不会有太大的改变,其本质上是具有现代默认设置的 Perl 5,并为之后进行更大的更改奠定了基础。具体来说,新的 Perl 7 实际上约等于前两天发布的 Perl 5.32。这里边有个有趣的事实是,Perl 6 已经与 Perl “分家”,并且还变成了名为“Raku”的项目。至于分开 v5 与 v6 的原因,相信大家已经不陌生了:Perl 5 与 Perl 6 存在难以调合的兼容性问题,使得二者基本变成为两种不同的语言,而同样名为 Perl,会让人误以为二者只是版本号上有所不同,这会导致损害 Perl 的形象。由于“Perl” 一词早已普遍被认为是“Perl 5”,因此最终经过讨论,Perl 6 更名了。Perl 7.0 在 v5.32 的基础上会更合理,具有更现代的默认设置,开发者不必管理太多配置,7.0 中已准备好。目前一些实验性功能可能会稳定下来,但没有大的重写或新特性。至于模块库 CPAN(Comprehensive Perl Archive Network),已维护模块应该仍然可以在 7.0 中运行,其余的将会有兼容模式,并且会针对几乎所有 CPAN 模块新版本进行测试。而 Perl 7 是否会有单独的 CPAN?这不好说,但是开发人员不想重做可以正常使用的东西,这项变更应该可以通过最少的附带任务进行管理。Perl 7 会减少什么内容呢?不多。默认情况下,某些功能将被禁用,但同样,其本质上是 Perl 5.32,第一轮可能被削的包括:间接对象符号(indirect object notation)裸字文件句柄(bareword filehandles),也许标准文件句柄会除外伪多维数组与哈希(fake multidimensional arrays and hashes),这是旧的 Perl 4 的东西了Perl 4 样式的原型定义(Perl 4-style prototype definitions),使用:prototype()替代有趣的是,在官方原博客中,谈及为什么从 Perl 5 跳到 Perl 7 而不是 6 的时候(Perl 6 已经改名,那么”Perl 6“这个代号实际上已经空缺出来了),其表示 Perl 曾经雄心勃勃重写 5.8 的计划没了下文……而下一个可用数字为 7,这只是序列上下一个数而已,进行这样的跳跃并非没有先例:PHP 直接从 5 升级到 7Solaris 2.6 跳到 Solaris 7Java 1.4 跳到 Java 5Windows 3.1 跳到 Windows 95(98、ME、2000、XP、Vista、7、8 与 10)……“至少不是 Perl 34。"最后,Perl 7 有望在一年内发布。W--wangzhiqiang 发表于2020-07-29 15:20:56 2020-07-29 15:20:56 最后回复 W--wangzhiqiang 2020-07-29 15:20:561851 0
-
1、简介 Perl,一种功能丰富的计算机程序语言,运行在超过100种计算机平台上,适用广泛,从大型机到便携设备,从快速原型创建到大规模可扩展开发。 官方链接:http://www.perl.org/ 类别:编程语言2、基础环境类别子项版本获取地址(方法)华为云虚拟机RC3(916)--OSCentOS7.5 Kernel4.14 软件包Perl5.16.3 3、依赖安装无4、组件编译安装在yum源中查找perl列表yum list | grep perl查出结果:在yum源中进行安装 5、系统配置无6、测试测试内容:perl是否安装成功perl -version测试结果:7、参考信息官方文档:http://www.perl.org/8、FAQ 无
推荐直播
-
全面解析华为云EI-API服务:理论基础与实践应用指南
2024/11/29 周五 18:20-20:20
Alex 华为云学堂技术讲师
本期直播给大家带来的是理论与实践结合的华为云EI-API的服务介绍。从“主要功能,应用场景,实践案例,调用流程”四个维度来深入解析“语音交互API,文字识别API,自然语言处理API,图像识别API及图像搜索API”五大场景下API服务,同时结合实验,来加深开发者对API服务理解。
回顾中 -
企业员工、应届毕业生、在读研究生共探项目实践
2024/12/02 周一 19:00-21:00
姚圣伟 在职软件工程师 昇腾社区优秀开发者 华为云云享专家 HCDG天津地区发起人
大神带你一键了解和掌握LeakyReLU自定义算子在ONNX网络中应用和优化技巧,在线分享如何入门,以及在工作中如何结合实际项目进行学习
即将直播 -
昇腾云服务ModelArts深度解析:理论基础与实践应用指南
2024/12/03 周二 14:30-16:30
Alex 华为云学堂技术讲师
如何快速创建和部署模型,管理全周期AI工作流呢?本期直播聚焦华为昇腾云服务ModelArts一站式AI开发平台功能介绍,同时结合基于ModelArts 的实践性实验,帮助开发者从理论到实验更好地理解和使用ModelArts。
去报名
热门标签