如何将复数从命令行传递到子MAIN?

时间:2016-03-08 15:59:57

标签: perl6

我有以下琐碎的剧本:

#!/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中有没有办法做到这一点?

2 个答案:

答案 0 :(得分:6)

实际上你写的东西很完美

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

问题只会出现,因为你实际上并没有在命令行上给它一个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已经涵盖了其余部分。

答案 1 :(得分:5)

如果你使用从Str到Complex的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