2010-05-24 31 views
72

Trong Perl hầu hết print báo cáo của tôi mang hình thứcLàm thế nào in của Perl có thể thêm một dòng mới theo mặc định?

print "hello." . "\n"; 

Có cách nào tốt đẹp để tránh giữ tất cả những pesky "\ n" s nằm xung quanh?

Tôi biết tôi có thể tạo một chức năng mới như myprint tự động gắn thêm \ n, nhưng sẽ rất tuyệt nếu tôi có thể ghi đè lên số print hiện tại.

+9

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

+1

'perldoc perlvar' mô tả hầu hết các cảnh báo, tại sao phải belabor chúng ở đây? –

+4

@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! –

Trả lời

84

Perl 6 có say chức năng tự động gắn thêm \n.

Bạn cũng có thể sử dụng say trong Perl 5,10 hoặc 5,12 nếu bạn thêm

use feature qw(say); 

với đầu chương trình của bạn. Hoặc bạn có thể sử dụng Modern::Perl để có được tính năng này và các tính năng khác.

Xem perldoc feature để biết thêm chi tiết.

+2

+1 để đề cập đến gói yêu cầu – Mike

+6

Thực tế, tất cả những gì bạn phải làm là 'sử dụng 5.012;' hoặc 'sử dụng 5.010;' để lấy nó nếu bạn chạy những «perl' mới hơn. –

+0

Không an toàn khi giả định rằng trừ khi Perl 6 được đề cập cụ thể là câu hỏi đề cập đến Perl 5? –

3

Trong Perl 6 có nghĩa là, các say chức năng

+14

Cũng trong 5,010 quá :-) – nc3b

+0

@ nc3b Ah, tiện dụng –

23

Nếu Perl 5.10+ không phải là một tùy chọn, dưới đây là một xấp xỉ nhanh chóng và dơ bẩn. Nó không hoàn toàn giống nhau, vì nói có một số phép thuật khi arg đầu tiên của nó là một tay cầm, nhưng để in tới STDOUT:

sub say {print @_, "\n"} 

say 'hello'; 
+1

@bernie Liên kết của bạn không còn tồn tại nữa – TheWanderingMind

17

Cách bạn viết câu lệnh in không cần thiết. Không cần phải tách dòng mới thành chuỗi riêng của nó. Điều này là đủ.

print "hello.\n"; 

Việc thực hiện này có thể giúp mã hóa của bạn dễ dàng hơn nói chung.

Ngoài việc sử dụng use feature "say" hoặc use 5.10.0 hoặc use Modern::Perl để có được xây dựng trong say tính năng, tôi sẽ dắt perl5i mà lần lượt vào rất nhiều hợp lý thiếu Perl 5 tính năng theo mặc định.

+11

facepalm.jpg ... – Mike

9

Có lẽ bạn muốn thay đổi dấu phân cách kỷ lục sản lượng của bạn để linefeed với:

local $\ = "\n";

$ perl -e 'print q{hello};print q{goodbye}' | od -c 
0000000 h e l l o g o o d b y e     
0000014 
$ perl -e '$\ = qq{\n}; print q{hello};print q{goodbye}' | od -c 
0000000 h e l l o \n g o o d b y e \n   
0000016 

Cập nhật: Câu trả lời của tôi nói với khả năng chứ không phải là advisability. Tôi không quan tâm đến việc thêm "\ n" vào cuối dòng để trở thành một việc vặt "pesky", nhưng nếu ai đó thực sự muốn tránh chúng, thì đây là một cách. Nếu tôi phải duy trì một chút mã có sử dụng kỹ thuật này, tôi có lẽ sẽ refactor nó ra pronto.

+5

hoặc chỉ in 'perl-in' q {hello}; in q {goodbye} '' – ysth

+6

Không, xin đừng làm vậy. Mặc dù về mặt kỹ thuật, câu trả lời đúng, sử dụng một biến đặc biệt cho một cái gì đó tầm thường vì đây là một gánh nặng bảo trì xuống đường. – tsee

+1

@tsee Tôi đồng ý hoàn toàn, thực sự. Khi tôi chỉnh sửa câu trả lời của mình để cho biết, câu trả lời của tôi mô tả khả năng, ngay cả khi người ta không khuyến khích nó như là một thực hành chung. –

0

Bạn có thể viết biểu mẫu có thể đọc được là sử dụng 5.010:

use v5.10; 
22

Bạn có thể sử dụng tùy chọn -l trong tiêu đề cô-bang:

#!/usr/bin/perl -l 

$text = "hello"; 

print $text; 
print $text; 

Output:

hello 
hello 
+2

Rất đẹp. Thông tin thêm về các tùy chọn 'perl', bao gồm những gì' -l' đang làm, [ở đây] (http://www.perl.com/pub/2004/08/09/commandline.html). – ruffin

+1

Bởi vì nó là một toàn cầu, đây là thực hành xấu trong bất cứ điều gì nhưng một lớp lót và nhỏ nhất của kịch bản. – Schwern

1

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 
# 
Các vấn đề liên quan