簡體   English   中英

為什么printf和sprintf在給定數組時表現不同?

[英]Why do printf and sprintf behave differently when only given an array?

sub do_printf  { printf @_ }
sub do_sprintf { print sprintf @_ }

do_printf("%s\n", "ok");  # prints ok
do_sprintf("%s\n", "ok"); # prints 2

sprintf有原型$@printf有原型@

來自sprintf上perldoc

與printf不同,當你將數組作為第一個參數傳遞給它時,sprintf不會做你可能想要做的事情。 數組被賦予標量上下文,而不是使用數組的第0個元素作為格式,Perl將使用數組中的元素計數作為格式,這幾乎從來沒用過。

請參閱codeholicMark的答案,了解他們為什么表現不同。

作為一種解決方法,只需:

sub do_sprintf { print sprintf(shift, @_) }

然后,

sub do_printf  { printf @_ }
sub do_sprintf { print sprintf(shift, @_) }

do_printf("%s\n", "ok");  # prints ok
do_sprintf("%s\n", "ok2"); # prints ok2

他們做不同的事情。 對於printf輸出是一個流; 對於sprintf你想要構造的字符串。 它處理打印命令的格式f )。 printf的主要目的是打印出它構造給流的值,但是使用s(tring)printf(ormat)你只是試圖創建字符串,而不是打印它。

printf返回打印到流中的字符數作為反饋。 一旦將字符打印到流中,它們就會從程序的邏輯結構中傳出。 與此同時, sprintf需要將一條繩子交給你。 最方便的方法是作為返回值 - 因為它在程序結構中可以檢查長度,或者它是否包含任何'e'或任何你想要的。

他們為什么不應該表現得不一樣?

sprintf在標量上下文中計算數組。 您的數組有兩個元素,因此它的計算結果為“2”(沒有尾隨\\ n)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM