【问题标题】:How can I swap two Perl variables without using the third?如何在不使用第三个的情况下交换两个 Perl 变量?
【发布时间】:2013-09-04 05:42:14
【问题描述】:

我想在不使用 Perl 中的第三个变量的情况下交换两个变量值,例如。 g.:

my $first = 10;
my $second = 20;

请建议我如何在 Perl 中以一种简单的方式做到这一点。

【问题讨论】:

  • ($first, $second)=($second, $first);这在技术上是在欺骗您的规则,因为它确实创建了一个匿名数组...
  • @abiessu:不,没有匿名数组。 (它们只是列表;对于匿名数组,您可以使用 [...] 来获取数组引用。)即使有 匿名数组,我想我也不会数它作为“第三个变量”。

标签: perl


【解决方案1】:

仅提供给我们的最好方法是这样在一行中您可以交换值:

 ($first, $second) = ($second, $first);

【讨论】:

  • 是的,但我会建议你以适当的方式拒绝。我正在更新我的答案
  • 您使用my 的版本在技术上不是交换现有变量的值,而是创建名称与现有变量相同的新变量。
  • 你为什么说你的第二个版本是最好的方法呢?第二个版本真的很晦涩。你的第一个版本更清晰。我每次都会使用它。
  • 我认为从逻辑上讲这是最好的方法。您可以在任何地方实现该代码。这就是我认为的原因..谢谢
  • 问题说“在 Perl 中”。您的第一个答案显然是在 Perl 中执行此操作的最佳方式。
【解决方案2】:

你可以写:

($first, $second) = ($second, $first);

(见§3.4 "List Assignment" in Learning Perl, Third Edition。)

【讨论】:

  • 我们已经到了Learning Perl 的第六版了:)
  • 你是说人们没有真正关注前五个?因为从其他答案的外观... ;-)
【解决方案3】:

已经列出的特定于 Perl 的方法是最好的,但这里有一种使用 XOR 的技术,适用于多种语言,包括 Perl:

use strict;

my $x = 4;
my $y = 8;

print "X: $x  Y: $y\n";

$x ^= $y;
$y ^= $x;
$x ^= $y;

print "X: $x  Y: $y\n";

X: 4  Y: 8
X: 8  Y: 4

【讨论】:

  • 这在 Perl 中不起作用,因为 ^ 运算符在字符串和数字形式中的语义略有不同。将您的值之一更改为非数字字符串,您将看到问题。
  • ...如果 $x == $y,至少如果它们是数字的话,它将不起作用。
【解决方案4】:

您可以使用简单的数学相对容易地做到这一点。

我们知道;

First = 10
Second = 20

如果我们说First = First + Second

我们现在有以下内容;

First = 30
Second = 20

现在你可以说Second = First - Second (Second = 30 - 20)

我们现在有;

First = 30
Second = 10

现在从 First 中减去 Second,得到 First = 20Second = 10

【讨论】:

  • 太复杂了。为什么不只是($first, $second) = ($second, $first)
  • 它不仅复杂,而且已经损坏。这个答案应该被删除。
【解决方案5】:
$first = $first + $second;
$second = $first - $second;
$first = $first-$second;

这将交换两个整数变量 更好的解决方案可能是

$first = $first xor $second;
$second = $first xor $second;
$first = $first xor $second;

【讨论】:

  • 这也假设变量包含像数字一样可加/减的数据。
  • Re:“这将在任何编程语言中交换两个整数变量”:我认为这有点过于宽泛了。即使我们限制考虑允许您为现有变量分配新值的语言,这也不适用于整数溢出未明确定义的语言中的所有整数值。 (例如,在 C 中,这段代码很危险。)
  • 太复杂了。为什么不只是($first, $second) = ($second, $first)
  • 你看它就知道它太复杂了。它需要三个语句,而列表赋值只需要一个。列表分配准确地显示了正在发生的事情(两个变量正在交换它们的值),而在您的版本中,该过程的要点仅作为某些算术的副作用发生。问问自己,一个随机的程序员是否能够通过查看您的代码来理解正在发生的事情。最后,您的代码甚至不能解决整个问题。刚才提到的问题是“变量值”。您的解决方案仅适用于数字。
  • 这不起作用,因为您将破坏标量的非数字字符串值。它也可能会改变浮点值。
【解决方案6】:
#!/usr/bin/perl

$a=5;
$b=6;

print "\n The value of a and b before swap is --> $a,$b \n";

$a=$a+$b;
$b=$a-$b;
$a=$a-$b;

print "\n The value of a and b after swap is as follows:";
print "\n The value of a is ---->$a \n";
print "\n The value of b is----->$b \n";

【讨论】:

  • 这不起作用,因为您将破坏标量的非数字字符串值。它也可能会改变浮点值。
【解决方案7】:

你可以使用这个逻辑

firstValue = firstValue + secondValue;

secondValue = firstValue - secondValue;

firstValue = firstValue - secondValue;

【讨论】:

  • 太复杂了。为什么不只是($first, $second) = ($second, $first)
  • 这不起作用,因为您将破坏标量的非数字字符串值。它也可能会改变浮点值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多