1. 程式人生 > >perl的輸出:print、say和printf

perl的輸出:print、say和printf

上下 不知道 返回值 一個 語言 sort 註意 world 由於

print、printf和say

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","\n";   # 列表上下文
print "hello world\n";      # 標量上下文
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。

另外,由於print/say不使用括號的時候,它們會輸出其後面的列表。所以有以下技巧:

  • 像cat命令一樣,直接輸出文件內容:print <>;
  • 像sort命令一樣,排序文件內容:print sort <>;

perl的輸出:print、say和printf