2016-03-08 35 views
4

我有以下的瑣碎的腳本:如何將一個複雜的數字從命令行傳遞給sub MAIN?

#!/usr/bin/env perl6 

use v6.c; 

sub MAIN($x) 
{ 
    say "$x squared is { $x*$x }"; 
} 

與實數調用它時這工作完全正常,但我想通過它的複數爲好。 當我嘗試這原樣,會發生以下情況:

% ./square i 
Cannot convert string to number: base-10 number must begin with valid digits or '.' in '⏏i' (indicated by ⏏) 
    in sub MAIN at ./square line 7 
    in block <unit> at ./square line 5 

Actually thrown at: 
    in sub MAIN at ./square line 7 
    in block <unit> at ./square line 5 

當我改變我的腳本

#!/usr/bin/env perl6 

use v6.c; 

sub MAIN(Complex $x) 
{ 
    say "$x squared is { $x*$x }"; 
} 

它停止工作完全:

% ./square i 
Usage: 
    square <x> 

% ./square 1 
Usage: 
    square <x> 

有什麼辦法在當前的Perl 6中執行此操作?

回答

5

它的工作好了很多,如果你使用Coercive type declaration從力量到複雜:

sub MAIN(Complex(Str) $x) 
{ 
    say "$x squared is { $x*$x }"; 
} 

然後:

% ./squared.pl 1 
1+0i squared is 1+0i 
% ./squared.pl 1+2i 
1+2i squared is -3+4i 
+0

謝謝,這很好。有點不幸的是./square i'不行(方法'Complex'沒有找到'Str'類的調用者),你必須做'./square 0 + 1i',但我可以忍受。 – mscha

6

其實你寫的作品完美

$ ./test.pl6 2+3i 
2+3i squared is -5+12i 

概率lem只顯示出來,因爲你實際上並沒有在命令行給它一個Complex的號碼。

$ ./test.pl6 2 
Usage: 
    ./test.p6 <x> 

你真正想要的是強迫其他Numeric類型Complex。所以你應該寫下類似的東西。

#!/usr/bin/env perl6 

use v6.c; 

sub MAIN (Complex(Real) $x) { 
    say "$x squared is { $x*$x }"; 
} 

我用Real代替Numeric,因爲Complex已擁有涵蓋的其餘部分。

相關問題