2010-11-03 15 views
11

thể trùng lặp:
What is the best way to slurp a file into a string in Perl?nộp đọc vào biến trong Perl

là mã này một cách tốt để đọc nội dung của một tập tin vào một biến trong Perl? Nó hoạt động, nhưng tôi tò mò nếu có một thực hành tốt hơn tôi nên sử dụng.

open INPUT, "input.txt"; 
undef $/; 
$content = <INPUT>; 
close INPUT; 
$/ = "\n"; 
+0

Đó không phải là mã tốt. Điều này tốt hơn: 'open (my $ fh," <: encoding (UTF-8) "," input.text ") || chết "không thể mở input.text: $!"; $ content = do {local $ /; <$fh>}; đóng ($ fh) || chết "không thể đóng input.text: $!"; ' – tchrist

Trả lời

26

Tôi nghĩ thực tế phổ biến là một cái gì đó như thế này:

my $content; 
    open(my $fh, '<', $filename) or die "cannot open file $filename"; 
    { 
     local $/; 
     $content = <$fh>; 
    } 
    close($fh); 

Sử dụng 3 lập luận open là an toàn hơn. Sử dụng tập tin xử lý như biến là làm thế nào nó nên được sử dụng trong Perl hiện đại và sử dụng local $/ khôi phục giá trị ban đầu của $/ vào cuối khối, thay vì mã cứng của bạn \n.

+1

Xem http://search.cpan.org/dist/File-Slurp/extras/slurp_article.pod –

2

Lưu ý rằng nếu bạn đang ở trong một môi trường nơi lắp đặt các module là có thể, bạn có thể muốn sử dụng IO::All:

use IO::All; 
my $contents; 
io('file.txt') > $contents; 

Một số các khả năng nhận được một chút điên rồ, nhưng họ cũng có thể khá hữu ích.

+0

Mô-đun phi tiêu chuẩn cộng với quá tải một cách thủ thuật'> 'nhà điều hành chỉ để đọc một tập tin, một cái gì đó mỗi lập trình viên Perl sẽ có thể làm trong giấc ngủ của họ, có vẻ như nó đang đi khá xa. – tchrist

+1

tchrist, quá tải không phải là vấn đề, [conflating HTTP với truy cập tập tin cục bộ của một PHP 'readfile' của PHP] (http://php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen) (chúng ta biết làm thế nào abysmal mà bật ra) là. Nhưng tại sao lại ghét các module CPAN? Họ là lợi thế của Perl, [thật ngu ngốc khi không chơi nó] (http://stackoverflow.com/q/3700037#3700066). Nhưng thậm chí đi xa để phát minh ra một thuật ngữ chiến đấu chống lại họ, điều đó không thể tốt. – daxim

12
use File::Slurp; 
my $content = read_file('input.txt') ; 
+2

Tôi không đồng ý với việc tải một mô-đun chỉ để mở và đọc một tệp. Việc có thể mở và đọc các tập tin là quá cơ bản để một hoạt động không hiểu rất, rất tốt. – tchrist

+15

Tôi không đồng ý với việc không ngừng viết năm dòng mã giống nhau khi một cộng với một mô-đun sẽ thực hiện. – Quentin

+4

Nó thậm chí không phải là một mô-đun chuẩn. Điều này làm giảm tính di động của mã. – tchrist