perl perl用法 - 為什麼這個程序有效? 我試圖創建一個語法錯誤




download win (5)

Perl有一個叫做“間接方法符號”的語法。 它允許

Foo->new($bar)

寫成

new Foo $bar

這意味著

Syntax error ! exit 0;

是相同的

error->Syntax(! exit 0);

要么

error->Syntax(!exit(0));

它不僅是有效的語法,它不會導致運行時錯誤,因為執行的第一件事是exit(0)

我在Windows 7上運行ActiveState的32位ActivePerl 5.14.2。我想要用Git pre-commit hook來檢測正在檢查的語法錯誤的程序。 (不知何故,我只是設法做了這麼糟糕的提交。)所以作為一個測試程序,我隨機記下了這個:

use strict;
use warnings;

Syntax error!

exit 0;

但是,它編譯和執行時沒有警告,退出時errorlevel為零。 這個有效的語法如何?


你沒有得到錯誤的原因是第一個執行的代碼是

exit(0);

因為第一行沒有分號:

Syntax error!

編譯器會猜測(不正確),這是一個使用not運算符的子程序調用! 然後它會執行這個子例程的參數,它恰好是exit(0) ,此時程序退出並將errorlevel設置為0.沒有其他任何操作被執行,因此不會報告更多的運行時錯誤。

你會注意到,如果你把exit(0)改成print "Hello world!" 你確實得到一個錯誤:

Can't locate object method "Syntax" via package "error" ...

並且你的錯誤級別將被設置:

> echo %errorlevel%
255

如上所述,這是由間接方法調用符號造成的。 你可以提醒一下:

use strict;
use warnings;
no indirect;

Syntax error!

exit 0;

生產:

Indirect call of method "Syntax" on object "error" at - line 5.

這需要間接CPAN模塊

你也可以no indirect "fatal";使用no indirect "fatal"; 導致程序死亡(這是我所做的)


試試Perl 6 ,它似乎更容易滿足您的期望:

===SORRY!=== Error while compiling synerror.p6
Negation metaoperator not followed by valid infix
at synerror.p6:1
------> Syntax error!⏏<EOL>
    expecting any of:
        infix
        infix stopper

Perl pack函數將根據模板返回“二進制”數據。

open(my $out, '>:raw', 'sample.bin') or die "Unable to open: $!";
print $out pack('s<', 255);
close($out);

在上面的例子中, 's'告訴它輸出一個short (16位), '<'強制它輸出little-endian模式。

另外, open ':raw'調用中的':raw'告訴它將文件句柄放在重要的平台上的二進制模式(相當於使用binmode )。 PerlIO手冊頁提供了有關以不同格式進行I / O的更多信息。





perl