簡體   English   中英

Perl substr(STRING,@ARRAY)ne substr(STRING,OFFSET,LENGTH)?

[英]Perl substr(STRING, @ARRAY) ne substr(STRING, OFFSET, LENGTH)?

為什么在Perl中:

@x=(0,2); 
substr('abcd',@x)

評價為“cd”?

和這個:

substr('abcd',0,2);

評價為“ab”?

substr運算符的文檔語法是

substr EXPR,OFFSET,LENGTH,REPLACEMENT
substr EXPR,OFFSET,LENGTH
substr EXPR,OFFSET

substr EXPR,ARRAY

或更通用的

substr EXPR,LIST

這反映在prototype的輸出中(盡管你不能總是依賴於此)。

$ perl -E'say prototype "CORE::substr"'
$$;$$
  • substr的第一個參數在標量上下文中進行評估。
  • substr的第二個參數在標量上下文中計算。
  • substr的第三個參數(可選)在標量上下文中計算。
  • substr的第四個參數(可選)在標量上下文中進行評估。

標量上下文中的@x是它包含的元素數(在本例中為2 )。

您可以使用以下方法實現您想要的目標:

sub mysubstr {
    if    (@_ == 2) { substr($_[0], $_[1]) }
    elsif (@_ == 3) { substr($_[0], $_[1], $_[2]) }
    elsif (@_ == 4) { substr($_[0], $_[1], $_[2], $_[3]) }
    else { die }
}

my @x = (0, 2);
mysubstr('abcd',@x)

substr有一個原型作為內置函數,所以@x未展開是在標量上下文中計算的,它返回2,所以基本上你調用substr('abcd',scalar(@x))

第一個在標量上下文中使用@x ...意味着@x的大小因此substr('abcd',2)給出了cd

暫無
暫無

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

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