2012-01-22 28 views

Trả lời

57

Chỉ cần đọc các tập tin vào một mảng, một dòng cho mỗi phần tử, là tầm thường:

open my $handle, '<', $path_to_file; 
chomp(my @lines = <$handle>); 
close $handle; 

Bây giờ các dòng của fi le nằm trong mảng @lines.

+4

Bạn thực sự phải xử lý trường hợp cho lỗi 'mở', bằng cách kiểm tra giá trị trả lại hoặc sử dụng tự động sửa. Để được đúng chính xác, bạn cũng nên làm tương tự cho 'đóng'. – zgpmax

1

Tie::File là những gì bạn cần:

Tóm tắt

# This file documents Tie::File version 0.98 
use Tie::File; 

tie @array, 'Tie::File', 'filename' or die ...; 

$array[13] = 'blah';  # line 13 of the file is now 'blah' 
print $array[42];  # display line 42 of the file 

$n_recs = @array;  # how many records are in the file? 
$#array -= 2;   # chop two records off the end 


for (@array) { 
    s/PERL/Perl/g;   # Replace PERL with Perl everywhere in the file 
} 

# These are just like regular push, pop, unshift, shift, and splice 
# Except that they modify the file in the way you would expect 

push @array, new recs...; 
my $r1 = pop @array; 
unshift @array, new recs...; 
my $r2 = shift @array; 
@old_recs = splice @array, 3, 7, new recs...; 

untie @array;   # all finished 
+7

IMHO 'Tie :: Tệp' là quá mức cần thiết cho một tác vụ đơn giản là đọc tệp và đặt nội dung trong một mảng. – dgw

+1

[Tie :: File] (http://p3rl.org/Tie::File) là quá mức cần thiết trừ khi tệp của bạn rất lớn. –

10

Có là phương pháp đơn giản nhất, sử dụng mô-đun File::Slurp:

use File::Slurp; 
my @lines = read_file("filename", chomp => 1); # will chomp() each line 

Nếu bạn cần một số xác nhận cho mỗi dòng bạn có thể sử dụng grep trước read_file.

Ví dụ, đường bộ lọc chỉ chứa số nguyên:

my @lines = grep { /^\d+$/ } read_file("filename", chomp => 1); 
+1

Không thực sự. Bạn quên ** chomp **. Có lẽ điều này sẽ hoạt động tốt hơn: my @data = map {chomp $ _; $ _} read_file ("tên tệp"); –

+0

Lúc đầu, tôi đã không chú ý, mỗi dòng của một tập tin chứa một số. Vì vậy, sẽ tốt hơn nếu đặt regex cho các số thành 'map' thay vì' chomp'. Đã cập nhật. – Taras

+2

Đầu tiên. Nếu ai đó thực sự cần chomp() thì hãy sử dụng tùy chọn read_file ("tên tệp", chomp => 1) thay vì bản đồ. Thứ hai. Tôi không nghĩ rằng ai đó thực sự cần xác thực. Câu hỏi không phải là cách đọc số từ một tập tin. Thứ ba. Bạn không kiểm tra các con số như 3.1415. Forth. Bạn có thể muốn sử dụng grep {/^\ d + /} thay vì bản đồ. –

8

Tôi thích ...

@data = `cat /var/tmp/somefile`; 

Nó không phải là quyến rũ như những người khác, nhưng, nó hoạt động như nhau. Và ...

$todays_data = '/var/tmp/somefile' ; 
open INFILE, "$todays_data" ; 
@data = <INFILE> ; 
close INFILE ; 

Chúc mừng.

+1

Tôi khuyên bạn nên thêm 'chomp': ' @data = grep {chomp; } \ 'cat/var/tmp/somefile \'; ' – brablc

+1

Đây không phải là cách tốt hay an toàn để thực hiện. Xem http://perl-begin.org/tutorials/bad-elements/#slurp – 0112

Các vấn đề liên quan