以下代碼回傳“Bareword found where operator expected at (eval 1) line 1, near "*,out" (Missing operator before out?)”
$val = 0;
$name = "abc";
$myStr = '$val = ($name =~ in.*,out [)';
eval($myStr);
根據我的理解,我可以通過用“//”包裝“in.*,out [”塊來解決這個問題。
但是“in.*,out [”可以變化。(例如:用戶輸入)。并且用戶可能會錯過'//'。因此,有沒有其他方法來處理這個問題。?(如:則回傳0的eval()正試圖回傳“裸詞發現哪里......”)
uj5u.com熱心網友回復:
(string) eval的魔力——以及危險——在于它將一堆虛擬字符轉換為代碼,編譯并運行它。那么可以使用'$x = ,hi'嗎?哦,不,當然,當該字串被認為是代碼,那么這是一個松散的逗號運營商那里,語法eror; 和一個“裸詞” hi。?字串必須產生有效的代碼
在字串 eval 中,運算式的值(它本身在標量背景關系中確定)首先被決議,如果沒有錯誤,則作為當前 Perl 程式的詞法背景關系中的塊執行。
因此,問題中的字串只是(嚴重)無效的代碼,無法編譯,期間。如果in.*,out [字串的一部分在某種引號中,那么這是合法的,=~操作員會將其視為模式,并且您有一個正則運算式。但是當然為什么不使用正則運算式的正常模式分隔符,例如//(orm{}等)。
無論以哪種方式獲取該字串,它都會在一個變數中,不是嗎?因此,您可以事先將其/$input/放入eval并填充$input。
但是,最重要的是,您確定沒有其他方法嗎?總是有的。字串 -eval復雜且棘手且難以正確使用且幾乎無法證明其合理性 - 并且很危險。它運行任意代碼!即使沒有任何惡意,這也會嚴重破壞事情。
我強烈建議考慮其他解決方案。
?一個問題,如果你到warnings了,我們都是。
uj5u.com熱心網友回復:
以下不是有效的 Perl 代碼:
$val = ($name =~ in.*,out [)
您需要以下內容:
$val = $name =~ /in.*,out \[/
(括號無害,但也無濟于事。)
如果模式是用戶提供的,則可以使用以下內容:
$val = $name =~ /$pattern/
(不需要eval EXPR!)
從更正中注意問題中的模式不正確。您可以使用捕獲此類錯誤eval BLOCK
eval { $val = $name =~ /$pattern/ };
die("Bad pattern \"$pattern\" provided: $@") if $@;
關于用戶提供的模式的注意事項:以上不會讓用戶執行任意代碼,但它不會保護您免受需要比宇宙生命周期更長的時間才能完成的模式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/344833.html
標籤:perl
