2010-01-24 37 views
22

Sự khác biệt giữa my ($variableName)my $variableName trong Perl là gì? Những gì để các dấu ngoặc đơn làm gì?

+1

Thú vị Perl Monks trả lời [ở đây] (http://www.perlmonks.org/?node_id=693666) mà cuối cùng đun sôi việc sử dụng các parens trong tuyên bố nhiệm vụ như là một kết thúc chạy xung quanh hoạt động vô ích ưu tiên. – ruffin

+0

Câu trả lời đầy đủ, chi tiết ở đây: [Hướng dẫn nhỏ: Trình điều khiển gán danh sách vô hướng và danh sách] (http://www.perlmonks.org/?node_id=790129). – ikegami

Trả lời

19

Hiệu quả quan trọng là khi bạn khởi tạo biến cùng một lúc mà bạn khai báo nó:

my ($a) = @b; # assigns $a = $b[0] 
my $a = @b;  # assigns $a = scalar @b (length of @b) 

Thời gian khác, điều quan trọng là là khi bạn khai báo nhiều biến.

my ($a,$b,$c); # correct, all variables are lexically scoped now 
my $a,$b,$c; # $a is now lexically scoped, but $b and $c are not 

Báo cáo cuối cùng sẽ cho bạn lỗi nếu bạn use strict.

+10

Về bản chất: các dấu ngoặc 1. cung cấp ngữ cảnh danh sách và 2. phân phối toán tử hoặc hàm trên nhiều giá trị. – Ether

+2

# 2 về mặt kỹ thuật là không chính xác và có khả năng gây nhầm lẫn. Nó là không chính xác trong đó cách khai báo với parens hoạt động là bằng cách xác định một danh sách từ vựng chứ không phải là một scalar từ vựng. Nó là gây hiểu lầm trong đó một người mới bắt đầu có thể đọc "các dấu ngoặc ... phân phối toán tử hoặc hàm trên nhiều giá trị" và mong đợi '($ x, $ y) = (1, 2) + 3' để gán giá trị 4 cho' $ x' và 5 đến '$ y' bằng cách" phân phối toán tử + trên nhiều giá trị ". (Trong thực tế, câu lệnh đó gán 5 cho '$ x' và không có gì là' $ y'.) –

+3

# 1 cũng không hoàn toàn chính xác. Các parens ở phía bên trái của một nhiệm vụ cung cấp ngữ cảnh danh sách, nhưng điều đó không có nghĩa là chúng cung cấp ngữ cảnh danh sách ở mọi nơi khác. –

4

Vui lòng xem perdoc perlsub để biết thêm thông tin về nhà điều hành my. Dưới đây là một trích đoạn nhỏ:

Tóm tắt:

my $foo;   # declare $foo lexically local 
    my (@wid, %get); # declare list of variables local 
    my $foo = "flurp"; # declare $foo lexical, and init it 
    my @oof = @bar;  # declare @oof lexical, and init it 
    my $x : Foo = $y; # similar, with an attribute applied 
1

Như câu trả lời và ý kiến ​​giải thích khác sử dụng dấu ngoặc cung cấp danh sách bối cảnh vào biến. Dưới đây là đoạn mã cung cấp một số giải thích thêm bằng cách sử dụng chức năng perl split.

use strict; 

my $input = "one:two:three:four"; 

# split called in list context 
my ($out) = split(/:/,$input); 
# $out contains string 'one' 
#(zeroth element of the list created by split operation) 
print $out,"\n"; 

# split called in scalar context 
my $new_out = split(/:/,$input); 
# $new_out contains 4 (number of fields found) 
print $new_out,"\n"; 

4

Câu trả lời ngắn gọn là ngoặc đơn ngữ cảnh lực khi được sử dụng ở bên trái của =.

Mỗi câu trả lời khác chỉ ra một trường hợp cụ thể, điều này tạo nên sự khác biệt. Thực sự, bạn nên đọc qua perlfunc để có ý tưởng tốt hơn về cách các hàm hoạt động khác nhau khi được gọi trong ngữ cảnh danh sách như trái ngược với ngữ cảnh vô hướng.

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