Làm cách nào để sử dụng từ khóa “của tôi” trong Perl?


89

Tôi tiếp tục thấy từ khóa "của tôi" trước các tên biến trong tập lệnh Perl ví dụ trực tuyến nhưng tôi không biết nó có nghĩa là gì. Tôi đã thử đọc các trang hướng dẫn sử dụng và các trang khác trực tuyến nhưng tôi gặp khó khăn trong việc phân biệt nó dùng để làm gì vì sự khác biệt giữa cách tôi thấy nó được sử dụng và hướng dẫn sử dụng.

Ví dụ: nó được sử dụng để lấy độ dài của mảng trong bài đăng này: Tìm kích thước của mảng trong Perl

Nhưng hướng dẫn sử dụng nói:

A của tôi khai báo các biến được liệt kê là cục bộ (từ vựng) cho khối, tệp hoặc eval bao quanh. Nếu nhiều hơn một giá trị được liệt kê, danh sách phải được đặt trong dấu ngoặc đơn.

Nó làm gì và được sử dụng như thế nào?


3
Re "nó được sử dụng để lấy độ dài của mảng trong bài đăng này", Không hề. myít nhất đã không ảnh hưởng đến nó. Đó là toán tử gán vô hướng ( =) đã thực thi ngữ cảnh vô hướng trên @arr.
ikegami

Nếu nó không thực sự là "của bạn", bạn không nên sử dụng nó.
icenac,

Câu trả lời:


138

myhạn chế phạm vi của một biến. Phạm vi của một biến là nơi nó có thể được nhìn thấy. Giảm phạm vi của biến đến nơi cần biến là một khía cạnh cơ bản của lập trình tốt. Nó làm cho mã dễ đọc hơn và ít bị lỗi hơn, đồng thời dẫn đến một loạt các lợi ích thu được.

Nếu bạn không khai báo một biến bằng cách sử dụng my, một biến toàn cục sẽ được tạo thay thế. Điều này là phải tránh. Việc sử dụng use strict;cho Perl biết rằng bạn muốn được ngăn chặn việc tạo biến toàn cục một cách ngầm định, đó là lý do tại sao bạn nên luôn sử dụng use strict;(và use warnings;) trong các chương trình của mình.


Bài đọc liên quan: Tại sao sử dụng use strict;use warnings;?


10
Cuối cùng là một câu trả lời giải thích tại sao .
ThisSuitIsBlackNot

Đối với những người đến đây từ JS: Về cơ bản, nó giống varlettrong JavaScript. Không có 'use strict';JS sẽ cho phép bạn khai báo các biến toàn cục mới mà không có từ khóa, điều này không được coi là phương pháp hay nhất.
Electric Coffee

@Electric Coffee, Theo thuật ngữ JS, câu hỏi sẽ là "Những gì letvarlàm và làm thế nào chúng nên được sử dụng?" Và có, câu trả lời sẽ gần giống nhau. ( letVars của JS rất giống myvars của Perl , ngoại trừ việc letkhông thể nắm bắt được vars.)
ikegami

Ý tôi chỉ là nếu mọi người đến Perl từ JS, đó sẽ là một cách dễ dàng để giải thích khái niệm tương tự
Electric Coffee

@ElectricCoffee 1) Một lập trình viên hiểu được phạm vi không cần phải giải thích lại cho họ sau khi chuyển đổi ngôn ngữ. 2) Không chắc chắn rằng bạn đã thực sự giải thích phạm vi, theo cách mà một lập trình viên JS sẽ hiểu hoặc theo cách khác. Có lẽ bạn đang cố gắng giải thích use strict;? Nhưng đó không phải là câu hỏi, và use strict;còn hơn thế nữa. Hoặc có thể bạn muốn giao tiếp mygiới hạn phạm vi của vars đại loại là thích letvarlàm, nhưng đó là câu đầu tiên của câu trả lời. 3) Nếu bạn muốn trả lời một câu hỏi theo cách khác, thì đó là câu trả lời.
ikegami

27

Tóm tắt nhanh: mytạo một biến mới, localtạm thời sửa đổi giá trị của một biến

Trong ví dụ dưới đây, $ :: a đề cập đến $ a trong không gian tên 'toàn cầu'.

$a = 3.14159;
{
  my $a = 3;
  print "In block, \$a = $a\n";
  print "In block, \$::a = $::a\n";
}
print "Outside block, \$a = $a\n";
print "Outside block, \$::a = $::a\n";

# This outputs
In block, $a = 3
In block, $::a = 3.14159
Outside block, $a = 3.14159
Outside block, $::a = 3.14159

tức là, localtạm thời thay đổi giá trị của biến, nhưng chỉ trong phạm vi mà nó tồn tại.

Nguồn: http://www.perlmonks.org/?node_id=94007

Cập nhật

Về sự khác biệt giữa ourmyvui lòng xem

(Cảm ơn ThisSuitIsBlackNot ).


Bạn muốn giải thích 'của họ'? Tôi luôn thấy những điều đó khó hiểu.
rdodev

@rdodev: Ý bạn là gì?
Igor Chubin

Tôi tiếp tục thấy mã perl với cả 'của tôi' và 'của họ' và chưa bao giờ hiểu rõ sự khác biệt, trong thực tế.
rdodev

@rdodev: bạn có thể vui lòng gửi cho tôi một liên kết đến một số mã với their?
Igor Chubin

3
@rdodev Tôi nghĩ ý bạn là our: stackoverflow.com/questions/845060/…
ThisSuitIsBlackNot

4

Biến Riêng qua my () là tài liệu chính cho my.

Trong ví dụ về kích thước mảng mà bạn đề cập, nó không được sử dụng để tìm kích thước của mảng. Nó được sử dụng để tạo một biến mới để giữ kích thước của mảng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.