2017-09-10 33 views
8

Phần bên dưới có vẻ hoạt động chính xác nếu không có đối số dòng lệnh nào, nhưng khi tất cả chúng tôi nhận được là số lượng đối số được cung cấp, không phải chính đối số. Nó xuất hiện @ARGV bị buộc vô hướng bởi ||. Tôi cũng đã thử sử dụng or// với kết quả tương tự. Nhà điều hành chính xác để sử dụng ở đây là gì?Làm cách nào để sử dụng một mảng mặc định nếu không có đối số dòng lệnh nào?

say for @ARGV || qw/one two three/; 
+0

Không có toán tử đơn nào để sử dụng thay cho '||' làm cho công việc đó như mong muốn. Gần nhất tôi có thể nghĩ đến là '(@ARGV? @ARGV: qw (một hai))' – zdim

+0

[Câu hỏi liên quan] (https://stackoverflow.com/q/16883923/133939) – Zaid

Trả lời

6

Các || operator áp đặt bối cảnh vô hướng bởi bản chất của những gì nó làm

Binary "or" trả về logic phân ly của hai biểu thức xung quanh. Nó tương đương với || ngoại trừ ưu tiên rất thấp.

(nhấn mạnh mỏ). Vì vậy, khi toán hạng bên trái của nó là một mảng nó nhận được chiều dài của mảng.

Tuy nhiên, nếu đó là 0 phía bên tay phải chỉ là đánh giá

Điều này có nghĩa rằng nó ngắn mạch: biểu thức đúng được đánh giá chỉ khi biểu thức bên trái là sai.

gì được nêu ra trong C-Style Logical Or in perlop

vô hướng hoặc danh sách bối cảnh truyền xuống các toán hạng đúng nếu nó được đánh giá.

để bạn có danh sách trong trường hợp đó.

Không có nhà điều hành nào có thể thực hiện những gì tuyên bố của bạn mong muốn. Gần nhất có thể là

say for (@ARGV ? @ARGV : qw(one two)); 

nhưng có cách tốt hơn và có hệ thống hơn để xử lý @ARGV.

+0

'@ARGV = @ARGV | | qw (một hai ba); ' – Zaid

+0

@Zaid https://eval.in/858898 –

+0

@Zaid 'perl -wE' @ ary = qw (một hai); nói cho (@ary = @ary || 1..3) ''in' 2 3' – zdim

0

Chỉ cần viết hai dòng.

@ARGV = qw[...] unless @ARGV; 
say for @ARGV; 
Các vấn đề liên quan