2015-05-05 17 views
8

Tôi đã nhìn vào cách hiệu quả để đọc tập tin trong Perl và đi qua này rất thú lót:tập tin Fancy slurping trong Perl

my $text = do { local (@ARGV, $/) = $file; <> }; 

Câu hỏi của tôi là: Làm thế nào chính xác để làm việc này? Thông thường khi slurping một tập tin bạn đặt $/ = undef, nhưng tôi không thấy làm thế nào điều này. Đoạn mã nhỏ này tỏ ra rất khó khăn để quấn quanh đầu tôi.

Điều gì sẽ là giải thích đơn giản và giải thích cho điều này?


Bây giờ tôi biết cách hoạt động của nó, hãy để chúng trở nên thật sự ưa thích!

Không phải mã này có thực sự sử dụng hay không; nó chỉ là thú vị để tìm ra và mát mẻ để xem xét. Đây là một lớp lót để slurp nhiều tập tin cùng một lúc !!!

my @texts = map { local (@ARGV, $/) = $_; <> } @files; 
+1

perl cho phép gán nhiều biến trong một lần gán (không biết cách nó được gọi đúng): '($ a, $ b, $ c) = (1, 2)'. '$ c' ở đây sẽ kết thúc' undef' – n0rd

+3

Điều đó thật khủng khiếp. Bạn phải hỏi nó làm gì, vì vậy đừng lặp lại nó – Borodin

+1

Dòng mã này thực sự dường như là một đoạn mã Perl thường được sử dụng. Tôi đã nhìn thấy nó ở nhiều nơi, đó là điều khiến tôi hỏi câu hỏi này. – tjwrona1992

Trả lời

10
local (@ARGV, $/) = $file; 

cũng giống như

local @ARGV = ($file); 
local $/ = undef; 

<> sau đó đọc từ các tập tin đề cập trong @ARGV, ví dụ: từ $file.

+1

Ồ, điều đó có ý nghĩa, sau đó' do {} 'chỉ trả về bất cứ điều gì giá trị của biểu thức được đánh giá cuối cùng là, đó sẽ là giá trị của '<>' hoặc nội dung của tệp. Cảm ơn @charoba! – tjwrona1992

+0

@ jwrona1992, Điểm của 'do' là giới hạn phạm vi trong đó' @ ARGV' và '$ /' được thay đổi. – ikegami

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