2013-07-01 23 views
13

Với chương trình này:Tại sao perl dịch một dấu tích vào dấu hai chấm?

use strict; 
use warnings; 

my $zx_size = 32; 
my $x = "$zx_size'h0"; 

Perl nói với tôi điều này:

Name "zx_size::h0" used only once: possible typo at concat.pl line 7. 
Use of uninitialized value $zx_size::h0 in string at concat.pl line 7. 

Tại sao?

Dường như có nhiều cách để chỉ định không gian tên của var. Có người khác không?

Có thể tắt hành vi này không?

+0

thử này "$ zx_size \ 'h0" (với dấu chéo ngược) hoặc "$ zx_size 'h0" ; (với không gian trống). Về cơ bản bạn phải tách biến và nội dung của chuỗi. Perl nghĩ rằng zxsize'h0 là tên của biến. Hoặc bạn có thể thử "$ zx_size". "'h0" là tốt. Tất cả là tốt nhất. – Sai

+0

Có thể trùng lặp của [Perl string, một biến trong một chuỗi theo sau là một dấu nháy đơn và một ký tự khác làm gì?] (Http://stackoverflow.com/questions/39360205/perl-string-a-variable-in-a- chuỗi-theo-by-a-single-quote-và-khác-chara) – Oktalist

Trả lời

19

gói delimiter cũ là một dấu nháy đơn ' mà ban đầu được sử dụng để giảm bớt t ransition để Perl cho Ada lập trình viên. Nó được thay thế bằng :: để dễ đọc hơn và dễ dàng chuyển đổi các lập trình viên C++.

Nó vẫn được hỗ trợ cho khả năng tương thích ngược, nhưng bạn có thể bọc vô hướng của mình theo số {..} để nội suy trở nên chính xác.

my $x = "${zx_size}'h0"; 

hoặc

my $x = "$zx_size\'h0"; 
+1

Hoặc 'my $ x = $ zx_size. "'h0"; ' –

+0

lạ. câu trả lời đã được đăng 21 giờ trước nhưng bình luận ở trên đã được thực hiện 20 giờ trước? BUG! – Sai

+1

Điều đó thực sự kỳ quặc. –

4

Đọc perlmod. Đoạn thứ hai. Và không, không có cách nào để tắt nó, ít nhất là bây giờ. Về mặt lý thuyết, ai đó có thể viết một pragma no feature cho nó, nhưng theo cách đó trong 20 năm mà không gây ra quá nhiều vấn đề ...

11

Ký tự trích dẫn đơn ' được sử dụng trước đó Perls để biểu thị phạm vi gói theo cách tương tự như :: và nó vẫn được hỗ trợ cho khả năng tương thích ngược.

Để làm những gì bạn muốn, bạn sẽ cần phải sử dụng cú pháp ${} nói với Perl nơi định danh kết thúc và bắt đầu theo nghĩa đen:

"${zx_size}'h0" 

Lưu ý rằng đây là điều mà bạn sẽ phải làm nếu bạn muốn giá trị của $zx_size tiếp theo bất kỳ ký tự chữ khác đó là pháp lý để xuất hiện trong một định danh:

"${zx_size}foo" 
Các vấn đề liên quan