Nếu bạn đang mắc kẹt với trước 5.10 , sau đó các giải pháp được cung cấp ở trên sẽ không sao chép hoàn toàn chức năng say
. Ví dụ
sub say { print @_, "\n"; }
sẽ không làm việc với lời gọi như
say for @arr;
hoặc
for (@arr) {
say;
}
... bởi vì các chức năng trên không hoạt động trên toàn cầu tiềm ẩn $_
như print
và chức năng thực sự say
.
Để tái tạo chặt chẽ hơn perl 5.10+ say
bạn muốn chức năng này
sub say {
if (@_) { print @_, "\n"; }
else { print $_, "\n"; }
}
Mà bây giờ đóng vai trò như thế này
my @arr = qw(alpha beta gamma);
say @arr;
# OUTPUT
# alphabetagamma
#
say for @arr;
# OUTPUT
# alpha
# beta
# gamma
#
Các say
BUILTIN trong Perl6 cư xử một chút khác nhau. Gọi nó với say @arr
hoặc @arr.say
sẽ không chỉ nối các mục mảng, mà thay vào đó in chúng được phân cách bằng dấu tách danh sách. Để tái tạo này trong Perl5 bạn sẽ làm điều này
sub say {
if (@_) { print join($", @_) . "\n"; }
else { print $_ . "\n"; }
}
$"
là biến danh sách tách toàn cầu, hoặc nếu bạn đang sử dụng English.pm
sau đó là là $LIST_SEPARATOR
nay Nó sẽ hoạt động giống như Perl6, như vậy
say @arr;
# OUTPUT
# alpha beta gamma
#
Nếu câu trả lời của bạn bao gồm $ \ hãy đảm bảo rằng nó đi kèm với danh sách cẩn thận về việc đặt biến toàn cầu với hiệu ứng vô hình. Trong khi rất thông minh và kỹ thuật của nó trả lời câu hỏi, nó cũng rất nguy hiểm để bàn tay không đủ điều kiện để một newbie. – Schwern
'perldoc perlvar' mô tả hầu hết các cảnh báo, tại sao phải belabor chúng ở đây? –
@David, bởi vì một số hacker ngẫu nhiên sẽ google các câu trả lời ở đây thay vì perldoc, hãy hài lòng với họ, và thậm chí sẽ không biết về sự cẩn thận! –