Raku 编程/基本操作
在过去的几章中,我们一直在研究 Raku 数据以及保存这些数据的变量。现在我们将探索在获得数据后可以对数据执行哪些操作。Perl 有一系列常规的算术运算符,可以应用于整数和浮点数,甚至还有一些适用于其他数据类型的运算符。一旦我们了解了所有常规的运算符,我们就可以开始研究元运算符,它们采用相同的概念并将其应用于不同的上下文。
运算符在其操作数上工作 - 正在执行操作的数量。要理解任何运算符,您必须了解其元数(它采用多少个操作数)。如果它采用一个操作数,则称为一元运算符;如果它采用两个操作数,则称为二元运算符;如果它采用三个操作数,则称为三元运算符。
最简单的算术运算符是一元符号运算符 +
和 -
。这些应用于数值值的前部以影响该数字的符号
my Int $x = 5;
$y = -$x # Now, $y is -5
还有一个前缀 +
运算符,它不会反转符号。
Raku 具有许多算术运算符,与其他编程语言类似。
my $x = 12;
my $y = 3;
my $z;
$z = $x + $y; # $z is 15
$z = $x - $y; # $z is 9
$z = $y - $x; # $z is -9
$z = $x * $y; # $z is 36
$z = $x / $y; # $z is 4
$z = $x % $y; # $z is 0 (remainder)
算术运算符需要数字参数,因此参数将自动转换为数字,就像我们使用上下文转换器 +( )
一样。
my Str $x = "123";
my Str $y = "456";
my Int $z = $x + $y; # 579
my Int $w = +($x) + +($y); # Same, but more verbose
在 Raku 中,符号 ~
始终与字符串相关联。当用作前缀时,它将它所使用的任何变量都转换为字符串(如果之前不是字符串)。当它用作两个字符串之间的运算符时,它会将字符串首尾相连,这个过程称为连接。
我们已经讨论过使用 ~( )
作为字符串上下文说明符。这被称为字符串化。字符串化将变量从其他类型转换为字符串表示。
两个字符串可以连接在一起以生成一个新的字符串
my Str $x = "hello " ~ "world!";
~
运算符会自动将任何不是字符串的参数转换为字符串。所以我们可以这样写
my Int $foo = 5;
my Str $bar = "I have " ~ $foo ~ " chapters to write";
print $bar;
这将打印出字符串:我还有 5 章要写
。
在大多数情况下,使用插值可能更容易,我们将在接下来讨论。
我们之前简要介绍过,字符串有三种基本类型:双引号字符串、单引号字符串和 heredocs。单引号字符串和双引号字符串看起来可能很相似,但它们的行为却不同。区别在于插值。
双引号字符串是可插值的。出现在字符串内的变量名将被转换为其字符串值并包含在字符串中。单引号字符串没有此行为
my Int $x = 5;
my Str $foo = "The value is $x"; # The value is 5
my Str $bar = 'The value is $x'; # The value is $x
变量增加或减少一的运算非常常见,因此需要专门的运算符。++
和 --
运算符可以用作标量变量的前缀或后缀。这两个不同的位置存在细微的差异。
my Int $x = 5;
$x++; # 6 (increment is done after)
++$x; # 7 (increment is done before)
$x--; # 6 (as above)
--$x; # 5 (as above)
两种形式,前缀形式和后缀形式,在上面的示例代码中似乎通常执行相同的操作。代码 ++$x
和 $x++
都执行相同的操作,但操作发生的时间不同。让我们用一些例子来演示这一点
my Int $x = 5;
my Int $y;
$y = $x++; # $y is 5, $x is 6
$y = ++$x; # $y is 7, $x is 7
$y = $x--; # $y is 7, $x is 6
$y = --$x; # $y is 5, $x is 5
前缀版本在变量在语句中使用之前执行递增或递减。后缀版本在变量使用后执行递增或递减。