• [专题汇总] 4月份干货合集它来了 ,小伙伴们快来看
    大家好,4月份干货合集又来了,这次主要带来的时候python相关的知识点,希望可以帮到大家。1.Ruby 迭代器及文件的输入与输出【转】https://bbs.huaweicloud.com/forum/thread-0224180932715256027-1-1.html2.Perl进行错误处理和创建子程序的示例【转】https://bbs.huaweicloud.com/forum/thread-0275180932589341012-1-1.html3.Perl 特殊变量详解【转】https://bbs.huaweicloud.com/forum/thread-0254180932469815022-1-1.html4.Perl语言的循环实现方法小结【转】https://bbs.huaweicloud.com/forum/thread-0221180932411580018-1-1.html    5.Perl语言的语法糖示例详解【转】https://bbs.huaweicloud.com/forum/thread-0278180932366717020-1-1.html6.perl 交叉编译详解【转】https://bbs.huaweicloud.com/forum/thread-0259180932299618019-1-1.html7.带你搞懂Python中__init__.py到底是什么【转】https://bbs.huaweicloud.com/forum/thread-0224180932100743026-1-1.html8.Python利用ElementTree实现快速解析XML文件【转】https://bbs.huaweicloud.com/forum/thread-0224180932024344025-1-1.html9.几种查看PyTorch、cuda 和 Python 版本方法小结【转】https://bbs.huaweicloud.com/forum/thread-02127180931934706017-1-1.html10.conda将python低版本环境升级到高版本的完整步骤【转】https://bbs.huaweicloud.com/forum/thread-0278180931858775019-1-1.html11.Python脚本实现删除谷歌浏览器历史记录【转】https://bbs.huaweicloud.com/forum/thread-0254180931766384021-1-1.html12.Python包管理利器之pip命令的安装与使用入门指南【转】https://bbs.huaweicloud.com/forum/thread-02127180931638312016-1-1.html13.Python常见数据类型处理详细代码示例【转】https://bbs.huaweicloud.com/forum/thread-02127180931580960015-1-1.html14.Python中解包操作的性能实测与最佳实践【转】https://bbs.huaweicloud.com/forum/thread-0254180931412732020-1-1.html15.Python字符串len()、split()、join()深度解析【转】https://bbs.huaweicloud.com/forum/thread-0278180931322530017-1-1.html
  • [技术干货] Perl进行错误处理和创建子程序的示例【转】
    在Perl中创建子程序(类似于其他编程语言中定义函数)的基本语法如下:使用sub关键字:这是定义子程序的关键字。子程序名称:可以是任何有效的Perl标识符。参数列表:子程序可以有零个或多个参数,在子程序体内通过@_数组访问。代码块:子程序的代码被大括号{}包围。下面是一个简单的Perl子程序示例:1234567sub my_subroutine {    my $param1 = shift; # 获取第一个参数    # 子程序的代码...    print "Hello, $param1!\n";}# 调用子程序my_subroutine("World"); # 输出: Hello, World!在上面的例子中,my_subroutine是一个子程序的名称,它接受一个参数并打印出来。shift函数用于从@_数组中取出第一个元素,该数组包含了传递给子程序的所有参数。Perl也支持使用命名参数,这样可以使代码更清晰:123456sub greet {    my ($name) = @_; # @_ 数组解构为一个名为 $name 的标量    print "Hello, $name!\n";}# 调用子程序greet("Alice"); # 输出: Hello, Alice!在这个例子中,greet子程序明确地期望一个名为$name的参数。此外,Perl 5.16及以上版本支持签名特性(:signatures),允许更清晰地定义子程序的参数:1234567use feature 'signatures';no warnings 'experimental::signatures';sub greet($name) {    print "Hello, $name!\n";}# 调用子程序greet("Bob"); # 输出: Hello, Bob!使用签名特性,子程序的参数列表写在子程序名称之后,参数类型和默认值也可以在这里定义(如果需要的话)。这种方式使代码易于阅读和维护。Perl提供了多种错误处理机制来确保程序的健壮性和稳定性。以下是一些常用的错误处理方法:使用die函数:die函数用于抛出一个异常并终止程序执行。它经常与错误消息一起使用,例如:1die "Something went wrong." if some_condition;使用warn函数:与die类似,warn函数用于发出警告信息,但不会退出程序。这可以用于记录问题而不中断程序流程。利用eval块:eval块允许你捕获和处理异常。如果eval块中的代码抛出了异常,你可以在外层进行处理:1234567eval {    # 可能抛出错误的代码};if ($@) {    # 错误处理代码    warn "An error occurred: $@";}使用$!变量:$!变量包含了上一次系统调用的错误信息。这可以用于提供更具体的错误反馈:123if (!open(FILE, 'filename')) {    die "Cannot open file $file: $!";}使用if语句:if语句可以检查函数的返回值,从而进行条件性的错误处理:123if (!open(FILE, 'filename')) {    die "Error: Cannot open file - $!";}使用unless语句:unless是if的反向语句,当表达式为假时执行:123unless (chdir('/etc')) {    die "Error: Cannot change directory - $!";}Carp模块:Carp模块提供了carp和croak函数,这些函数是warn和die的替代品,提供了更丰富的错误报告功能。异常处理:Perl支持使用eval进行异常处理,类似于其他语言中的try-catch机制。自定义错误处理:可以定义子程序来处理特定的错误情况,使错误处理更加模块化和可重用。资源管理:使用tie函数管理外部资源,它可以在资源使用完毕后自动释放,减少资源泄露的风险。通过这些方法,Perl允许开发者编写健壮的代码,能够优雅地处理运行时错误和异常情况。开发者应根据具体情况选择合适的错误处理策略,确保程序的稳定性和可靠性。
  • [技术干货] Perl 特殊变量详解【转】
    Perl 特殊变量Perl 语言中包含了许多特殊变量,这些变量在 Perl 程序的执行过程中扮演着重要的角色。特殊变量通常用于存储程序的状态信息、输入输出数据、错误信息等。理解和正确使用这些特殊变量对于编写高效的 Perl 代码至关重要。1. $_ - 默认变量$_ 是 Perl 中的默认变量,它被广泛用于许多函数和操作符中,尤其是在没有明确指定变量的上下文中。例如,在没有提供变量名的 print 函数中,它会默认打印 $_ 的值。1print "Hello, World!"; # 相当于 print $_;2. @ARGV - 命令行参数@ARGV 数组包含了从命令行传递给 Perl 脚本的参数。这使得从外部向脚本传递数据变得简单。123foreach (@ARGV) {    print "Argument: $_\n";}3. $ARGV - 当前命令行参数$ARGV 是 @ARGV 数组中的当前元素。在没有对 @ARGV 进行显式操作的情况下,它通常用于从命令行读取文件名。123while (<>) {    print;}4. @_ - 函数参数@_ 数组包含了传递给子程序的参数。在子程序内部,可以使用 @_ 来访问这些参数。12345sub my_subroutine {    foreach (@_) {        print "Parameter: $_\n";    }}5. $! - 错误消息$! 变量包含了最后一个系统调用或 Perl 函数失败时的错误消息。1open(FILE, 'nonexistent_file') or die "Cannot open file: $!";6. $? - 命令退出状态$? 变量包含了最后一个执行的系统命令的退出状态。这通常用于检查外部命令是否成功执行。12system('ls -l');print "Command exited with status $?";7. $$ - 进程 ID$$ 变量包含了当前 Perl 进程的进程 ID(PID)。1print "Process ID: $$\n";8. $. - 输入记录号$. 变量包含了从文件句柄读取的当前输入记录号。它通常用于跟踪文件中的行号。123while (<>) {    print "$. $_";}9. $^ - 脚本名称$^ 变量包含了正在执行的 Perl 脚本的名称。1print "Script name: $^";10. $| - 输出缓冲区$| 变量控制着输出缓冲区的行为。当设置为非零值时,它会导致缓冲区在每次写入后自动刷新。12$| = 1; # 禁用输出缓冲print "Immediate output\n";
  • [技术干货] Perl语言的循环实现方法小结【转】
    Perl是一种强大的脚本语言,以其灵活的语法和强大的文本处理能力著称。无论是在系统管理、网络编程,还是在Web应用开发中,Perl都广泛应用于各种领域。循环是编程语言中一个极其重要的概念,它允许程序重复执行某段代码直至满足特定条件。在本文中,我们将深入探讨Perl中的循环结构,包括for循环、while循环、do...while循环、以及foreach循环的用法和特点,并通过实例来说明这些循环的应用。一、Perl中的循环基本概念在Perl中,循环的主要作用是迭代地执行某段代码,直到满足特定条件。通过使用循环,可以避免编写重复的代码,从而提高代码的效率和可读性。1.1 循环的基本语法结构Perl中循环的基本语法结构大致如下:```perlfor循环for (初始化; 条件; 迭代) { # 循环体 }while循环while (条件) { # 循环体 }do...while循环do { # 循环体 } while (条件);foreach循环(用于数组)foreach my $element (@array) { # 循环体 } ```二、for循环for循环是最常见的循环结构之一,适用于需要知道循环执行次数的场景。2.1 for循环的基本使用下面是一个示例,展示了如何使用for循环打印从1到10的数字:1perl for (my $i = 1; $i <= 10; $i++) { print "$i\n"; }在这个例子中:my $i = 1是循环的初始化部分,设置循环变量$i的初始值为1。$i <= 10是循环的条件部分,表示当$i小于等于10时继续执行循环。$i++是迭代部分,每次循环结束后将$i的值加1。2.2 使用for循环遍历数组通常,for循环也可以用于遍历数组,下面是一个遍历数组的例子:```perl my @array = ('Perl', 'Python', 'Java', 'C++');for (my $i = 0; $i < @array; $i++) { print "$array[$i]\n"; } ```在这个例子中,通过数组的索引遍历并打印每个元素。三、while循环while循环适用于未知循环次数的情况,通常在循环体内部有条件变化。3.1 while循环的基本使用以下是一个基本的while循环示例:```perl my $count = 1;while ($count <= 10) { print "$count\n"; $count++; } ```在这个示例中,while循环将继续执行,直到$count的值大于10。3.2 while循环的应用场景你可以使用while循环来读取文件内容,例如:1perl open(my $fh, '<', 'file.txt') or die "无法打开文件: $!"; while (my $line = <$fh>) { print $line; } close($fh);在这个例子中,while循环逐行读取文件,直到文件结束。四、do...while循环do...while循环与while循环类似,但在执行循环体后进行条件判断,至少执行一次循环体。4.1 do...while循环的基本使用以下是一个使用do...while循环的例子:```perl my $count = 1;do { print "$count\n"; $count++; } while ($count <= 10); ```这个例子会打印1到10的数字,与while循环相比,它确保了循环体至少执行一次。五、foreach循环foreach循环主要用于遍历数组和数组引用。5.1 foreach循环的基本使用foreach的基本使用如下:```perl my @colors = ('red', 'green', 'blue');foreach my $color (@colors) { print "$color\n"; } ```在这个例子中,foreach循环遍历数组@colors的每个元素并打印。5.2 使用foreach循环处理哈希你也可以使用foreach循环处理哈希中的键值对:```perl my %fruit_color = ( 'apple' => 'red', 'banana' => 'yellow', 'grape' => 'purple', );foreach my $fruit (keys %fruit_color) { print "$fruit is $fruit_color{$fruit}\n"; } ```在这个示例中,我们通过keys函数获取哈希的所有键,然后打印每个水果及其对应的颜色。六、循环控制语句在Perl中,除了基本的循环语句外,还有控制循环执行的其他语句,如last、next和redo。6.1 last语句last用于提前跳出循环,通常用于满足特定条件时结束循环。例如:perl for (my $i = 1; $i <= 10; $i++) { last if $i == 5; # 当$i等于5时跳出循环 print "$i\n"; }这个示例将打印1到4,然后在$i等于5时停止执行。6.2 next语句next用于跳过当前循环的剩余部分,直接进入下一个循环。例如:perl for (my $i = 1; $i <= 10; $i++) { next if $i % 2 == 0; # 跳过偶数 print "$i\n"; }在这个示例中,只有奇数会被打印,偶数将被跳过。6.3 redo语句redo用于重新开始当前循环迭代。例如:perl for (my $i = 1; $i <= 10; $i++) { if ($i == 5) { redo; # 当$i等于5时重新开始当前循环 } print "$i\n"; }这个示例将导致无限循环,因为当$i等于5时,将重复执行这一迭代。
  • [技术干货] Perl语言的语法糖示例详解【转】
    一、什么是语法糖?在介绍Perl中的语法糖之前,我们首先需要理解什么是语法糖。语法糖是计算机编程中的一个术语,其主要目的在于让代码更易读。简单来说,语法糖为程序员提供了一种更为简便的方式来书写代码,这些代码在编译时将被转换为更为基础和复杂的语法。例如,在某些编程语言中,为了进行数组的遍历,程序员可能需要使用复杂的循环结构,而通过语法糖,则可以用更简洁的方式来实现同样的功能。这样,程序员就可以将注意力集中在逻辑实现上,而不是被繁琐的语法所困扰。二、Perl中的语法糖实例1. 数组和哈希的声明及访问在Perl中,数组和哈希的声明非常简单。通过简单的标识符加符号的方式,程序员可以方便地定义和访问数据。```perl声明数组my @array = (1, 2, 3, 4, 5);访问数组元素print $array[0]; # 输出1 ```上述代码中,数组的声明和元素访问都显得相当直观。通过@符号标识数组,再利用下标进行访问,这种方式使得代码的可读性得以提升。2. 迭代和循环在Perl中,也可以通过语法糖来简化循环的书写。比如,在对数组元素进行迭代时,我们可以使用foreach语句,这比标准的for循环要简洁得多。perl foreach my $element (@array) { print $element; }这里的foreach是Perl特有的一种语法糖,它使得数组的遍历若干倍简洁。在实际应用中,代码的简洁性能够极大提高团队的开发效率。3. 默认变量$_在Perl编程中,$_是一个特殊的默认变量,很多函数和控制结构会自动使用这个变量。在使用时,如果不特别指定变量名,Perl会隐式地将$_作为默认输入。这大大简化了函数的使用,尤其是在字符串处理时。```perl @array = (1, 2, 3);对数组进行操作,默认使用$_print for @array; # 输出123 ```上面的代码使用了print for @array,这样通过语法糖的方式,程序员可以用更少的代码实现相同的功能。4. 正则表达式正则表达式是Perl的一个强大功能,并且在语法层面上提供了许多友好的糖。在大多数情况下,使用正则表达式可以让文本处理变得极其简单。例如,使用=~操作符来测试一个字符串是否匹配某个模式。perl my $string = "Hello World"; if ($string =~ /World/) { print "Found World!"; }在这里,=~操作符和正则表达式的结合能够让字符串匹配的逻辑变得非常简洁。这种语法糖不仅让代码更加干净,而且有助于快速理解程序的意图。5. 块和被引用的代码Perl支持块(block)结构和被引用的代码(dummy code),这也是一种语法糖。通过将一些代码块封装起来,可以实现更为复杂的功能,而不需要冗长的代码。```perl sub greet { my $name = shift; return "Hello, $name!"; }my $message = greet("Perl"); print $message; # 输出Hello, Perl! ```在这个例子中,代码块被封装在greet subroutines中,通过简单的参数传递实现了功能的重用。这种结构化的方式使得代码更易于管理和维护。6. map和grep函数Perl中的map和grep函数同样是语法糖的极佳示例。这些函数的引入,极大地简化了对数组的操作,通过使用简单的语法就能实现复杂的功能。```perl my @squares = map { $ * $ } @array; # 计算平方 my @even = grep { $_ % 2 == 0 } @array; # 过滤偶数print "@squares"; # 输出1 4 9 16 25 print "@even"; # 输出2 4 ```在以上示例中,map用于生成平方数组,而grep则用于筛选偶数。这两种操作显著提高了代码的可读性和简洁性。三、语法糖的优点与缺点虽然语法糖确实有很多的优点,但也不能忽视其中的一些潜在缺点。优点可读性:简化了代码,提升代码的可读性,便于团队合作与维护。开发效率:帮助程序员以较少的代码实现复杂的功能,减少了编写和调试的时间。逻辑简单化:让开发者专注于逻辑,而不是繁琐的语法规则。缺点学习曲线:对新手来说,过多的语法糖可能会引起困惑,导致学习曲线陡峭。性能问题:在某些情况下,为了简化代码可能会引入性能问题,这需要开发者在使用时进行权衡。过度依赖:过于依赖语法糖可能导致代码的可移植性降低,尤其在不同版本的Perl中,某些语法糖的支持可能会不同。
  • [技术干货] perl 交叉编译详解【转】
    Perl是一种高级、通用、解释型、动态的编程语言。Perl设计的初衷是为了更好地处理文本处理任务,但随着时间的发展,现在它已经变成了一种强大的一般目的编程语言。Perl支持面向过程和面向对象的编程风格。Perl的特点:强大的字符串处理能力。包含众多的内置函数,利于处理文件和文本。支持正则表达式和模式匹配等高级文本操作。支持模块化编程,可以使用在CPAN(Comprehensive Perl Archive Network)中找到的大量预编译模块。支持面向对象的编程。能够方便地处理数据库和网络操作。perl解析器交叉编译下载源代码123# Get perl and perl-cross sourcescurl -L -O http://www.cpan.org/src/5.0/perl-5.24.1.tar.gzcurl -L -O https://github.com/arsv/perl-cross/releases/download/1.1.3/perl-cross-1.1.3.tar.gz解压源代码1234# Unpack perl-cross over perl, overwriting Makefiletar -zxf perl-5.24.1.tar.gzcd perl-5.24.1tar --strip-components=1 -zxf ../perl-cross-1.1.3.tar.gz指定交叉编译器123export CROSS_COMPILE="/home/***/bin/aarch64-linux-gnu-"export CC=${CROSS_COMPILE}gccexport CXX=${CROSS_COMPILE}g++交叉编译1234# Proceed as usual with most autoconfed packages./configure --target=aarch64-linux-gnu --prefix=/home/***/install_arm -Duseshrplib  -des -Duseembedmake -j4make install
  • [分享交流] 你觉得100年后会有多少种编程语言?你最擅长哪种语言?
    从最近来看,出现了大量新的编程语言。硬件性能提高是一个原因,这就允许工程师根据使用目的在运行速度和编程便利性之间做出不同的取舍。如果这就是未来的趋势,那么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
  • [技术干货] Circos移植指南 (CentOS 8.2)
    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文件。----结束
  • [生态空间] 【DWS 8.1.1.2】【Perl连接DWS】Perl连接DWS查询超长字符串返回空值
    【功能模块】【操作步骤&问题现象】1、通过Perl脚本连接到DWS,通过DBI->fetchrow()返回数据,查询的字段字符串如果长度超81,就会返回空值,在data studio中查询返回是正常的【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [指令翻译工具] 在exagear模式下跑开源测试用具UnixBench测试性能,提示启动失败,有谁有跑过这个工具?
    百度和google查了下,说是perl功能异常导致的,是不是exagear模式下perl不可用的?
  • [迁移系列] DWS perl通过ODBC连接GaussDB(DWS)
    摘要】 本文介绍使用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";
  • [技术干货] perl uc,lc,ucfirst,lcfirst大小写转换函数
    大小写字母转换:函数 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
  • [问题求助] 安装perl警告
    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 【日志信息】(可选,上传日志内容或者附件)
  • [分享交流] 官方宣布 Perl 7 计划
    摘自 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 有望在一年内发布。