這是我代碼的一部分:
my $suma = U::round $item->{ suma }; # line 36
$ts = $suma;
$tnds = U::round $suma /6;
}
return( $ts, $tnds );
}
sub create{ #line 46
my( $c ) = shift;
my $info = $c->req->json;
my $header = @$info[0] 。
my $details = @$info[1] 。
my $agre = D::T Agreement => $header-> { agreement_id };
my( $total_suma, $total_nds ) = total( $details ) 。
my $saldo = 0;
my $iid = @$details[0]-> { period };
my $interval = D::T Period => $iid //7; # line 58.
# This is first Invoice if operator do not provide activation date.
my $is_first = !$details->[0]{valid_from} & & $iid & & $interval。
當這個模塊被加載時,我產生了一個錯誤:
當這個模塊被加載時,我產生了一個錯誤。
Can't load application from file "lib/MaitreD/Controller/ManualDocument.pm line 38, near "my $interval = D::T Period => $iid /"
lib/MaitreD/Controller/ManualDocument.pm第38行結尾處有未知的重排修飾符"/6"
lib/MaitreD/Controller/ManualDocument.pm第41行,全域符號"$pkg "需要明確的包名(你忘記宣告 "my $pkg "了嗎?
...
這個間接物件呼叫是否有罪?
因為當我在U::round( $suma /6 )處加上括號時,沒有任何錯誤
uj5u.com熱心網友回復:
這里有一些關于這個問題的想法,以及一個合理的解釋。 一個簡單的再現
perl -wE'sub tt { say "@_" }; $v = 7; tt $v /3'
給了我
搜索模式在-e第1行沒有終止。
因此,它試圖在該子程式呼叫中決議一個重詞,正如所述,問題是:為什么?
在引數周圍有小括號的情況下,它能如期作業。如果后面有更多的引數,它就會以同樣的方式失敗,但如果前面有引數,它就會作業
。perl -wE'sub tt { say "@_" }; $v = 7; tt $v /3, 3' #以同樣的方式失敗。
perl -wE'sub tt { say "@_" }; $v = 7; tt 3, $v /3' # works
為tt子配備一個原型并沒有改變任何情況。
通過錯誤看來,/觸發了搜索關閉分隔符,一旦沒有找到,整個事情就失敗了。那么,為什么這被解釋為一個重合詞而不是分隔符呢?
似乎tt $v在決議中被分組,并被解釋為一個子和它的引數,因為它們后面有一個空格;然后/3被分開,然后這確實看起來像一個regex。?這仍然會作為一個語法錯誤失敗,但也許regex決議失敗首先出現。
那么其他逗號分隔的術語前后的區別就很明顯了--在tt 3, ...中,下面的$v /3是一個下一個引數的術語,并且被決議為除法。
這仍然留下了另一個問題。所有我試過的內置函式都沒有這個問題,無論是串列還是單數運算子,以及各種原型(push, chr, splice, 等等)--除了print,它確實有同樣的外觀問題。并且在使用和不使用帕累斯時都會失敗。
perl -wE'$v=110; say for unpack "A1A1", $v /2' #-> 5 5
perl -wE'$v=200; say chr $v /2'/span> #--> d
perl -wE'$v=3; push @ary, $v /2; say "@ary"'/span> #--> 1.5
perl -wE'$v = 7; say $v /3' #失敗,同樣的方法。
perl -wE'$v = 7; say( $v /3 )' #也失敗了,同樣的方法。
一個區別是,print服從 "特殊 "的決議規則,它允許第一個引數是一個檔案柄。(此外,它沒有原型,但這似乎并不重要。
那么運算式print $v /3...確實可以被決議為print filehandle EXPR,而以/開始的EXPR被決議為一個regex。同樣的情況也適用于小括號。?
所有這些都涉及到一些猜測,因為我不知道決議器是如何做到的。但這顯然是一個關于子程式呼叫如何決議的細節問題,其中(意外地)也包括了print。
在我看來,在(用戶定義的)子程式上使用圓點的明顯補救措施是合理的。另一個補救措施是對數學運算子周圍的空格保持一致,要么不在兩邊使用,要么在兩邊使用--這也很好,即使它很癢(空格?真的?
我不知道該如何評價say( $v /3 )的問題。
關于這個問題還有幾點評論。
根據問題中的錯誤資訊文本,未知的 regexp 修飾符"/6",似乎在那里,/被視為關閉分隔符,與上面的例子不同。而且,該資訊中還有更多的內容,這一點不清楚。最后,我們確實有一個非常相似的決議問題。
關于
的問題。至于
這個間接物件呼叫是否有罪?
我沒有看到那里有間接物件呼叫,只有一個正常的子程式呼叫。 另外,這個答案中的例子顯示了非常類似的行為,并排除了間接物件的語法。
?另一種可能是,
$v /3被決議為一個術語,因為它跟在(可識別的!)子程式名稱tt之后。 然后,重詞系結運算子=~ 系結比除法更緊密,在這里,它被暗示為明確地試圖默認系結到$_。
我認為這種可能性較小,而且它也無法解釋內置程式的行為,尤其是print。
? 那么我們可以推斷,其他具有可選的無逗號的第一個引數(因此沒有原型)的內置函式也是如此,但我不太容易想到。
uj5u.com熱心網友回復:
Perl認為符號/是一個正則運算式的開始,而不是一個除法運算子。https://perldoc.perl.org/perlre - 你可以查看perldoc中的正則運算式。
你可以嘗試在6之前添加一個空白字符,像這樣。$tnds = U::round $suma / 6;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311373.html
標籤:
