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ố?
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ố?
Enable kiểm tra lỗi tự động:
require IPC::System::Simple;
use autodie qw(:all);
⋮
my @output = `$cmd`;
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",
# ]
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.
đầu ra không phải là lỗi tôi không biết nó thực sự là gì –
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. –
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
Làm thế nào để bạn xác định rằng đầu ra không đi vào mảng? –