2012-06-05 26 views
8

Tôi muốn nhận được đầu ra của một lệnh vào một mảng — như thế này:Reading đầu ra từ lệnh vào Perl mảng

my @output = `$cmd`; 

nhưng có vẻ như đầu ra từ lệnh không đi vào mảng @output.

Bất kỳ ý tưởng nào về sự cố?

+5

Bạn có chắc chắn lệnh của bạn được ghi vào STDOUT không? Nếu nó ghi vào STDERR, các dấu gạch chéo ngược sẽ không nắm bắt được điều này mà không phụ thêm '2> & 1' vào cuộc gọi của bạn. – dgw

+3

Làm thế nào để bạn xác định rằng đầu ra không đi vào mảng? –

Trả lời

2

Enable kiểm tra lỗi tự động:

require IPC::System::Simple; 
use autodie qw(:all); 
⋮ 
my @output = `$cmd`; 
6

The (tiêu chuẩn) sản lượng không đi đến mảng:

[email protected]:listing # cat > demo.pl 
#!/usr/bin/perl 
use strict; 
use warnings; 
use v5.14; 
use Data::Dump qw/ddx/; 

my @output = `ls -lh`; 
ddx \@output; 
[email protected]:listing # touch a b c d 
[email protected]:listing # perl demo.pl 
# demo.pl:8: [ 
# "total 8\n", 
# "-rw-r--r-- 1 david staff  0B 5 Jun 12:15 a\n", 
# "-rw-r--r-- 1 david staff  0B 5 Jun 12:15 b\n", 
# "-rw-r--r-- 1 david staff  0B 5 Jun 12:15 c\n", 
# "-rw-r--r-- 1 david staff  0B 5 Jun 12:15 d\n", 
# "-rw-r--r-- 1 david staff 115B 5 Jun 12:15 demo.pl\n", 
# ] 
10

kịch bản đơn giản này làm việc cho tôi:

#!/usr/bin/env perl 
use strict; 
use warnings; 

my $cmd = "ls";  
my @output = `$cmd`;  
chomp @output; 

foreach my $line (@output) 
{ 
    print "<<$line>>\n"; 
} 

Nó được sản xuất đầu ra (trừ dấu chấm ba):

$ perl xx.pl 
<<args>> 
<<args.c>> 
<<args.dSYM>> 
<<atob.c>> 
<<bp.pl>> 
... 
<<schwartz.pl>> 
<<timer.c>> 
<<timer.h>> 
<<utf8reader.c>> 
<<xx.pl>> 
$ 

Đầu ra của lệnh được chia trên ranh giới dòng (theo mặc định, trong ngữ cảnh danh sách). chomp xóa các dòng mới trong phần tử mảng.

+0

đầu ra không phải là lỗi tôi không biết nó thực sự là gì –

+1

Sau đó, bạn có thể cần phải xác định lệnh của bạn cho chúng tôi rõ ràng hơn. Tôi đã chỉ định bài tập cho '$ cmd'; bạn đã không hiển thị những gì trong lệnh bạn đang thực hiện. Bạn đã thử sử dụng 'ls' hoặc' pwd' hoặc 'echo Hello World' làm lệnh để xem liệu bạn có nhận được gì đó hữu ích không? Bạn cũng không thể hiện cách bạn đang xử lý mảng. –

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