2015-07-13 13 views
15

tài liệu hướng dẫn của Perl nói rằng $/ là:

Đầu vào kỷ lục phân cách, xuống dòng theo mặc định. Điều này ảnh hưởng đến ý tưởng của 01lcủa Perl về "dòng" là gì.

Vì vậy, nó là cơ bản sai:

print STDERR $var, $/; 

thay vì:

print STDERR "$var\n"; 

?

Điều gì có thể xảy ra nếu tôi thực hiện điều này trước đây?

+1

Đây là bộ tách * đầu vào * có thể được điều khiển nếu bạn cần đọc các tệp được mã hóa CRLF hoặc CR. – tadman

+0

'$ /' là ký tự eol hệ thống, điều này tốt nếu tệp bạn đang tạo chỉ dành cho việc sử dụng "Địa phương". Nếu bạn đang tạo tệp cho một số hệ điều hành KHÁC, ví dụ: bạn đang trên Linux xây dựng một tệp Windows, sau đó '$ /' là vô dụng. –

+3

Bạn thực sự nên sử dụng dấu phân tách * đầu ra * '' $ \ '', nhưng tôi không thể thấy bất cứ điều gì sai trái khi thực hiện điều đó. Thực tế, hàm ['say'] (http://perldoc.perl.org/functions/say.html) chỉ làm như sau:" 'LIST' chỉ đơn giản là viết tắt của' {local $ \ = "\ n "; print LIST}' "(Nếu bạn đang sử dụng 5.10+, tôi sẽ chỉ sử dụng' say'.) – ThisSuitIsBlackNot

Trả lời

9

Có lẽ bạn đang tìm bộ tách bản ghi đầu ra thay thế?

perldoc perlvar:

 IO::Handle->output_record_separator(EXPR) 
    $OUTPUT_RECORD_SEPARATOR 
    $ORS 
    $\

Sản lượng kỷ lục tách cho các nhà điều hành in. Nếu được xác định, giá trị này được in sau đối số cuối cùng của bản in. Mặc định là "undef".

Bạn không thể gọi "output_record_separator()" trên tay cầm, chỉ như một phương thức tĩnh. Xem IO::Handle.

Ghi nhớ: bạn đặt "$\" thay vì thêm "\n" ở cuối bản in. Ngoài ra, nó giống như $/, nhưng đó là những gì bạn nhận được "trở lại" từ Perl.

Ví dụ,

$\ = $/; 
print STDERR $var; 
+5

Tôi nghĩ rằng đây là một ý tưởng rất xấu. Không có nhiều mô-đun tự bảo vệ mình trước khi '$ \' nhận được thay đổi, vì vậy việc thay đổi toàn cục '$ \' sẽ phá vỡ chúng. Bạn có thể giới hạn phạm vi của sự thay đổi bằng cách sử dụng '{local $ \ = $ /; in STDERR $ var; } ', nhưng đó là một mớ hỗn độn hoàn toàn so với' print STDERR '$ var \ n ";' hoặc 'nói STDERR $ var;'. – ikegami

+2

@ikegami Và tôi nghĩ rằng nếu các mô-đun không thể xử lý '$ \' thay đổi, đó là lỗi trong các mô-đun, đặc biệt là xem xét có một tùy chọn dòng lệnh thường được sử dụng để đặt '$ \' ('-l'). – hvd

+2

@hvd, Thường được sử dụng trong một lớp lót, có thể, nhưng tôi nghi ngờ rằng rất ít module làm 'local $ /;' trước mỗi 'print' bởi vì nó sẽ là ngớ ngẩn để làm điều đó, ngay cả khi bạn coi đó là lỗi. – ikegami

1

Bạn cần kỷ lục sản lượng tách $ \ như xxfelixxx đã trả lời.

$/ khi bạn đọc là input record separator. Thao tác nó có thể ảnh hưởng đến cách Perl đọc dữ liệu tệp bạn đã cung cấp. Ví dụ:

open my $fh, "<", $filename or die $!; 
local $/; # enable localized slurp mode 
my $content = <$fh>; 
close $fh; 

Ở trên làm cho toàn bộ nội dung tệp bị nén trong nội dung vô hướng $ vì chúng tôi đã đặt lại $/.

Hãy xem xét các đoạn mã sau:

#!/usr/bin/perl 
use strict; 
use warnings; 
my $content; 
{local $/; $content = <DATA>} 
print "Content is $content"; 
__DATA__ 
line 1 
line 2 
line 3 

Output:

Content is line 1 
line 2 
line 3 

Nhưng nếu bạn không đặt lại $ /, như trong đoạn mã sau:

#!/usr/bin/perl 
use strict; 
use warnings; 
my $content = <DATA>; 
print "Content is $content"; 
__DATA__ 
line 1 
line 2 
line 3 

Output sẽ Content is line 1 .

Điều này là do dấu phân cách bản ghi đầu vào đã được đặt thành dòng mới và nó được trả lại sau dòng đầu tiên.

7

$/ là LF (U + 000A) theo mặc định. Đây là cùng một ký tự được tạo bởi "\n"[1]. Vì vậy, trừ khi bạn thay đổi $/, $/"\n" là tương đương. Nếu bạn đã thay đổi $/ thì chỉ bạn biết tại sao và do đó, chỉ bạn biết liệu $/ hoặc "\n" có phù hợp hơn không.


  1. Mở hộp MacOS cổ đại, mặc định $/ 's là CR (U + 000D), nhưng đó cũng là những gì "\n" sản xuất ở đó.
Các vấn đề liên quan