为什么函数可以在Perl中全局访问

kha*_*vah 1 perl function

我刚刚开始阅读有关Perl的内容.我知道问一个问题还为时过早(我应该继续阅读),但我无法自拔.

我是一名c ++开发人员.我在Perl中注意到的是函数是"全局的".你不需要"包含"任何东西来使用很多功能.例如,在c ++中,如果要使用a string,则必须包含stringstl.在perl中,您不必包含任何操作字符串或数字(数学函数)的内容.所以,我的问题是:

为什么要让一切都"公开"?如果我想操纵字符串,为什么我需要访问数学函数?

ike*_*ami 8

我相信Perl原本打算成为管理员的工具,因此为此提供了大量的运营商.他们中的一些人甚至可以访问数据库!

虽然这些在Perl世界中被称为函数(基于它们被记录的文件的名称),但它们不是C++意义上的函数[1].他们真的是运营商[2],就像notand.作为运算符,它们不受限于正常的子例程语法.例如,子程序无法复制printsystem语法,这是构建它们的第二个原因.

不可否认,如果今天写的是Perl,情况会有所不同.计算机科学领域一直在发明限制范围的新方法.我们现在更加重视封装和最小内核.大多数操作符将被编写为模块中的子例程,并且大多数具有异常语法的操作符将被设计为采用正常的子例程参数.这不是推测性的; 你只需要看看Perl6,我敢打赌你会发现这是真的.那为什么要把一切都公开呢?我们不应该.


  1. "子例程"是C++调用函数的Perl字.

  2. perlfunc的前两句是:"本节中的函数可以作为表达式中的术语.它们分为两大类:列表运算符和命名的一元运算符."

    它们中的大多数最终被编译为Perl虚拟机中具有相同名称的运算符.

    >perl -MO=Concise,-exec -E"sub f { 'abcdef' }  say(substr(f(), 2, 3));"
    1  <0> enter
    2  <;> nextstate(main 48 -e:1) v:%,{,469764096
    3  <0> pushmark s
    4  <0> pushmark s
    5  <#> gv[*f] s
    6  <1> entersub[t3] sKS/TARG   <- A subroutine call
    7  <$> const[IV 2] s
    8  <$> const[IV 3] s
    9  <@> substr[t4] sK/3         <- substr operator
    a  <@> say vK                  <- say operator
    b  <@> leave[1 ref] vKP/REFC
    -e syntax OK
    
    Run Code Online (Sandbox Code Playgroud)