想要在perl中增强运算符“+”,这样如果两个操作数都是数字,它将是常规的添加操作
$a = 11;
$b = 12;
$x = $a + $b; #expect it to be 23
如果一个操作数是一个字符串,则将所有操作数转换为字符串并将它们视为连接。
$a = 11;
$b = " cars";
$x = $a + $b; #expect it to be "11 cars"
如果无法做到这一点,想知道我是否可以创建一个新的运算符来完成它。
答案 0 :(得分:3)
Perl不区分变量类型。这几乎与shell脚本和awk脚本的工作方式一致。变量可能是程序中一个位置的数字,另一个位置是字符串。 Perl希望你知道你在做什么:
#! /usr/bin/env perl
#
use strict;
use warnings;
use feature qw(say);
my $vendor_id = "344";
my $inventory_item = "23942";
print "You want to order item ";
print $vendor_id + $inventory_item;
print "\n";
这将打印:
You want to order item 24286
我将$vendor_id
添加到$inventory_item
。您可能想要做的是连接它们。
You want to order item 34423942
Perl无法判断你是否将变量视为字符串或数字,因此Perl会强制您使用运算符。 +
是数字加法,而.
是字符串连接。在许多语言中,这将是相同的运算符,但在Perl中,我们需要两个不同的运算符。为了做你想做的事,你会做到这一点:
print $vendor_id . $inventory_item;
VS
print $vendor_id + $inventory_item;
这就是为什么Perl有两组完全不同的布尔运算符:一组用于数字比较,一组用于字符串。这为Perl提供了极大的灵活性,因为变量可以在一个地方被视为一个数字,然后在另一个地方被视为一个字符串。但是,它也意味着您可以更好地了解您的变量应该代表什么。
在Python,Java,Swift和许多其他语言中,您将变量声明为字符串或数字。请注意,如果将变量声明为字符串并尝试添加它们,或将它们声明为某种形式的数字数据并尝试连接它们。在大多数语言中,您必须使用任一方法(如int2sting
)或声明将变量从一种形式转换为另一种形式。
如果您确实不了解自己的数据,并且不确定其代表什么,则可以使用Scalar::Util中的looks_like_number
。这不是内置函数,但Scalar::Util
是标准模块,可能已经在您的Perl发行版中了:
use strict;
use warnings;
use feature qw(say);
use Scalar::Util qw(looks_like_number);
my $first = "11";
my $second = " of cars";
if ( looks_like_number($first) and looks_like_number($second) ) {
say $first + $second; # Add the two numbers together
}
else {
say $first . $second; # At least one is a string, so concatenate them
}
现在,如果$first
和$second
看起来都是数字,那么它们就会被添加。但是,如果一个或另一个看起来不像数字,它们将被连接起来。
有Perl模块(我不记得了)会将Perl变成声明性语言,其中变量被告知它们是字符串,整数,浮点数等。由于许多原因,这些尝试都是不完整的。例如,您无法阻止某人使用更模糊的内置语法。
如果您具有更高级的Perl知识,则可以创建自己的对象类型,并使用overload
pragma重载每个类类型的操作定义:
use strict;
use warnings;
use feature qw(say);
use Object::Perl; # Hypothetical module
my $first = Object::Perl::String->new(11);
my $second = Object::Perl::String->new(" cars");
say $first + $second; # Overloaded "+" to concatenate two Object::Perl::String types
$first = Object::Perl::Int->new(11);
$second = Object::Perl::Int->new(12);
say $first + $second; $ Overloaded "+" to add two Object::Perl::Int types
但是,如果你遇到所有麻烦,你也可以学习Python。
答案 1 :(得分:0)
这没有任何意义。例如,以下输出应该是什么?
my $x = 11; print("$x\n");
my $y = 12; print("$y\n");
print($x+$y, "\n");
my $m = "11"; print(0+$m, "\n");
my $n = "12"; print(0+$n, "\n");
print($m+$n, "\n");
请注意,$x
和$m
相同(它们都包含数字和字符串),$y
和$n
也是如此。
SV = PVIV(0x16f2dd8) at 0x16fe8b0 $x
REFCNT = 1
FLAGS = (PADMY,IOK,POK,pIOK,pPOK)
IV = 11
PV = 0x16f7b30 "11"\0
CUR = 2
LEN = 16
SV = PVIV(0x16f2e20) at 0x16fea60 $m
REFCNT = 1
FLAGS = (PADMY,IOK,POK,pIOK,pPOK)
IV = 11
PV = 0x17086b0 "11"\0
CUR = 2
LEN = 16
SV = PVIV(0x16f2df0) at 0x16fe8f8 $y
REFCNT = 1
FLAGS = (PADMY,IOK,POK,pIOK,pPOK)
IV = 12
PV = 0x171eee0 "12"\0
CUR = 2
LEN = 16
SV = PVIV(0x16f2e08) at 0x170eee8 $n
REFCNT = 1
FLAGS = (PADMY,IOK,POK,pIOK,pPOK)
IV = 12
PV = 0x17320e0 "12"\0
CUR = 2
LEN = 16