如何增强运营商" +"在perl

时间:2014-09-04 18:15:06

标签: perl

想要在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"

如果无法做到这一点,想知道我是否可以创建一个新的运算符来完成它。

2 个答案:

答案 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