如何使用Perl在方程中使用变量

时间:2013-10-12 15:05:17

标签: perl math

我正在尝试在Perl的等式中使用可能的变量。

例如:

#!/usr/bin/perl -w

$a = "yellow";

$b = "orange";

$c = "col1fl0ur";

$c = $a + $b;

print "$a + $b = $c \n";

我希望能够说明每个变量$a$b$c的值,然后才能说明

$a + $b = "col1fl0ur"
你可能会问;重点是什么?只打印col1fl0ur,但我希望能够使用更多的变量,例如在这种情况下:

#!/usr/bin/perl -w


###values###
$a = "yellow";

$b = "orange";

$c = "col1fl0ur";

$d = "derp";

$e = "oplo";

$f = "qwerty";


###defining the equation###
$c = $a + $b;

$d = $a + $c;

$f = $d + $c;


###Printing###
print "$a + $b = $c \n";
print "$a + $c = $d \n";
print "$d + $c = $f \n";

3 个答案:

答案 0 :(得分:1)

如果你解释了真正的问题会对你有所帮助,但这样的事情可能有所帮助。

请注意,永远不会在实时代码中使用$a$b,因为它们是保留变量名。

use strict;
use warnings;

my ($a, $b, $c, $d, $e, $f) = qw( yellow orange col1fl0ur derp oplo qwerty );

### defining the equation ###

my %sum;
$sum{$a}{$b} = $c;
$sum{$a}{$c} = $d;
$sum{$d}{$c} = $f;

### Printing ###

for my $pair ([$a, $b], [$a, $c], [$d, $c]) {
  my ($p1, $p2) = @$pair;
  printf "%s + %s = %s\n", $p1, $p2, $sum{$p1}{$p2};
}

<强>输出

yellow + orange = col1fl0ur
yellow + col1fl0ur = derp
derp + col1fl0ur = qwerty

如果您希望$b + $a$a + $b相同,那么您必须明确说明。例如,

$sum{$a}{$b} = $c;
$sum{$b}{$a} = $c;

答案 1 :(得分:1)

你可以使用Overload pragma .. 您可以按如下方式创建新包:

package Tst;
use overload "+" => \&myadd;

sub new {
    my $class = shift;
    my $value = shift;
    return bless \$value => $class;
}

sub myadd {
    my ($x, $y) = @_;
    $x = ref($x) ? $$x : $x;
    $y = ref($y) ? $$y : $y;
    my $value = '';
    if ($x eq 'yellow' and $y eq 'orange'){
        $value = 'col1fl0ur';
    }
    return $value;
}
1

然后在你的主程序中,你可以做你喜欢的事情:

use Tst;

my $a = Tst->new('yellow');
my $b = Tst->new('orange');

my $c = $a + $b;

say $c;

打印出col1fl0ur

答案 2 :(得分:1)

您可以考虑创建一个适合您目的的数据结构(无论它们是什么样的!?!),而不是将值分配给Perl变量($a, $b, $c等)。鲍罗丁的答案朝着这个方向迈出了一步。

这个例子使这个想法更进一步:你的“数学”系统中的术语不会与个别的Perl变量相关联;相反,它们将是更大数据结构的组成部分。

use strict;
use warnings;

my %xs = (
    a => 'yellow',
    b => 'orange',
    c => 'col1fl0ur',
    d => 'foo',
    e => 'bar',
    f => 'fubb',
    g => 'blub',
);

$xs{'a + b'}         = $xs{c};
$xs{'a * c'}         = $xs{d};
$xs{'d / c'}         = $xs{f};
$xs{'a + b - d + f'} = $xs{g};

printf("%15s = %s\n", $_, $xs{$_}) for sort keys %xs;

输出:

              a = yellow
          a * c = foo
          a + b = col1fl0ur
  a + b - d + f = blub
              b = orange
              c = col1fl0ur
              d = foo
          d / c = fubb
              e = bar
              f = fubb
              g = blub