2013-09-04 27 views
11

Tôi muốn trao đổi hai giá trị biến mà không sử dụng biến thứ ba trong Perl, e. g .:Làm thế nào tôi có thể trao đổi hai biến Perl mà không sử dụng thứ ba?

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

Hãy giới thiệu cho tôi cách chúng tôi có thể thực hiện điều này trong Perl một cách đơn giản.

+0

($ đầu tiên, $ giây) = ($ giây, $ đầu tiên); Đây là kỹ thuật lừa dối các quy tắc của bạn vì nó tạo ra một mảng vô danh ... – abiessu

+6

@abiessu: Không, không có mảng ẩn danh nào. (Chúng chỉ là các danh sách, đối với một mảng ẩn danh, bạn sẽ sử dụng '[...]' để lấy một mảng.) Và ngay cả khi có * là một mảng ẩn danh, tôi không nghĩ rằng tôi sẽ đếm nó dưới dạng "biến số ba". – ruakh

Trả lời

18

Cách tốt nhất mà chỉ cung cấp cho chúng là như thế này trong một dòng, bạn có thể trao đổi các giá trị:

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

Điều này có tác dụng tốt đối với tôi .. –

+0

Yup nhưng tôi sẽ đề nghị bạn bỏ một cách thích hợp. Tôi đang cập nhật câu trả lời của mình – Developer

+2

Phiên bản của bạn với 'my' về mặt kỹ thuật không trao đổi giá trị của các biến hiện tại, mà là tạo mới các biến có tên đổ bóng các tên hiện có. – ruakh

20

Bạn có thể viết:

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

(Xem §3.4 "List Assignment" in Learning Perl, Third Edition.)

+2

Chúng tôi đang cập nhật phiên bản thứ sáu của [Learning Perl] (http://www.learning-perl.com) ngay bây giờ :) –

+1

Bạn có nói rằng mọi người không thực sự chú ý đến năm người đầu tiên? Bởi vì từ cái nhìn của các câu trả lời khác ... ;-) –

-5
$first = $first + $second; 
$second = $first - $second; 
$first = $first-$second; 

này sẽ trao đổi hai biến số nguyên Một giải pháp tốt hơn có thể là

$first = $first xor $second; 
$second = $first xor $second; 
$first = $first xor $second; 
+1

Điều này cũng giả định rằng các biến chứa dữ liệu có thể thêm/trừ như số. – abiessu

+3

Re: "Điều này sẽ trao đổi hai biến số nguyên trong bất kỳ ngôn ngữ lập trình": Đó là một chút quá rộng, tôi nghĩ. Ngay cả khi chúng tôi hạn chế xem xét các ngôn ngữ cho phép bạn chỉ định giá trị mới cho các biến hiện tại, điều này sẽ không hoạt động cho tất cả các giá trị số nguyên trong các ngôn ngữ mà tràn số nguyên không được xác định rõ. (Ví dụ, trong C mã này là nguy hiểm.) – ruakh

+0

okk .. my mistake. Tôi đã không xem xét số nguyên tràn.Nhưng tôi nghĩ rằng sẽ luôn có một phạm vi cho các số nguyên trong bất kỳ ngôn ngữ nào. Hãy chỉ ra sai lầm của tôi nếu tôi sai. anyways tôi đã chỉnh sửa câu trả lời. cảm ơn – rove101

-4

Bạn có thể làm điều này tương đối dễ sử dụng toán học đơn giản.

Chúng tôi biết;

First = 10 
Second = 20 

Nếu chúng ta nói First = First + Second

Bây giờ chúng ta có như sau;

First = 30 
Second = 20 

Bây giờ bạn có thể nói Second = First - Second (Second = 30 - 20)

Bây giờ chúng ta có;

First = 30 
Second = 10 

Bây giờ trừ thứ hai từ đầu tiên, và bạn sẽ có được First = 20, và Second = 10.

+3

Quá phức tạp. Tại sao không chỉ '($ đầu tiên, $ giây) = ($ giây, $ đầu tiên)'? –

+2

Không chỉ phức tạp, nó bị hỏng. Câu trả lời này sẽ bị xóa. –

-6

bạn có thể sử dụng logic này

firstValue = firstValue + secondValue; 

secondValue = firstValue - secondValue; 

firstValue = firstValue - secondValue; 
phương pháp
+0

Quá phức tạp. Tại sao không chỉ '($ đầu tiên, $ giây) = ($ giây, $ đầu tiên)'? –

+1

Điều này sẽ không hoạt động vì bạn sẽ hủy giá trị chuỗi không phải là số của một vô hướng. Nó cũng có thể thay đổi các giá trị dấu phẩy động. –

-1

Các Perl cụ thể đã được liệt kê là tốt nhất, nhưng đây là kỹ thuật sử dụng XOR hoạt động ở nhiều ngôn ngữ, bao gồm 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 
+5

Điều này sẽ không hoạt động trong Perl vì toán tử '^' có ngữ nghĩa hơi khác nhau ở dạng chuỗi và số. Thay đổi một trong các giá trị của bạn thành chuỗi không phải là số và bạn sẽ thấy sự cố. –

+0

... và nó sẽ không hoạt động nếu $ x == $ y, ít nhất là nếu chúng là số. – Jan

-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"; 
+2

Điều này sẽ không hoạt động vì bạn sẽ hủy giá trị chuỗi không phải là số của một vô hướng. Nó cũng có thể thay đổi các giá trị dấu phẩy động. –

Các vấn đề liên quan