• Perl的输出:print、say和printf、sprintf


    print、printf和say都可以输出信息。print和say类似,print不自带换行符,say自带换行符,但要使用say,必须写use语句use 5.010;,printf像C语言的printf一样,可以定制输出格式,不过我这perl似乎不支持printf,一用就报错,不知道为什么。它们有返回值:如果输出成功,就返回1。

    注意perl中有上下文的概念,这几个输出操作也同样有上下文环境:列表上下文。

    @arr=qw(hello world);
    print "hello world","
    "; 
    print "hello world
    ";  
    print @arr;            # 输出helloworld(没空格)
    print "@arr";          # 输出hello world(有空格)
    
    use 5.010;
    say "hello world!";  # 自带换行符
    

    这些本没有什么可解释的,但是print/say可以以函数格式(print(args)/say(args))进行输出,这时候有个陷阱需要注意。

    print(3+4)*4;
    

    这个返回7,而不是28。这是怎么计算的?

    Perl中很多时候是可以省略括号的,这往往让我们忘记括号的归属。而Perl中又有上下文的概念,在不同上下文执行同一个操作的结果是不一样的。在这里:

    • print不加括号的时候,它需求的参数是一个列表上下文,它后面的所有内容都会被print输出
    • print加括号的时候,它只会输出括号中的内容

    所以,上面的语句等价于:

    (print(3+4))*4
    

    它先执行print(7),然后拿到print的返回值1,将其乘以4,由于没有赋值给其它变量,所以这个乘法的结果被丢弃。

    如果将上面赋值给一个变量:

    $num = print(3+4)*4;
    

    $num的值将为4。

    如果想要输出(3+4)*4=28的结果,可以将它们放在一个括号里,或者在(3+4)的括号前加一个+号,它表示让它后面的表达式作为函数的参数,相当于加个括号。所以,下面两个是等价的语句:

    print ((3+4)*4);
    print +(3+4)*4;
    

    另外,由于print/say不使用括号的时候,它们会输出其后面的列表。所以有以下技巧:

    • 像cat命令一样,直接输出文件内容:print <>;
    • 像sort命令一样,排序文件内容:print sort <>;
  • 相关阅读:
    ExtJS 使用点滴 四 XTemplate使用方法
    ExtJS 使用点滴 三 TreeGrid 单击事件侦听例子
    VS2008 引用App_Code下的类文件问题解决方法
    C# 文件操作类大全(转摘)
    SqlParameter数组
    ExtJS 使用点滴 二 如何使用XTemplate基于同行的其他列的值,改变当前列的显示样式
    ScriptManager.RegisterStartupScript方法
    ExtJS 使用点滴 一(XTemlpate)
    Jquery 远程调用 webService报错,500错误
    C# 调用数据库函数 转摘
  • 原文地址:https://www.cnblogs.com/f-ck-need-u/p/9557517.html
Copyright © 2020-2023  润新知