Khi tôi thực hiện system()
cuộc gọi trong Perl, tôi thường kiểm tra mã trả lại theo số perldocs. Vâng, tôi nghĩ vậy. Phần lớn thời gian $rc!=0
là đủ cho tôi. Gần đây tôi đã giúp hai người ở đây gặp sự cố với các cuộc gọi system()
khi chạy tập lệnh .cgi của họ dưới apache. Tôi hướng dẫn họ để kiểm tra $rc
của
my $rc = system(...);
và liên kết chúng với system()
tài liệu. Sau đó, tôi nhìn kỹ hơn và nhận thấy các tài liệu không thực sự nói về $rc
nhưng thay vì về $?
và tôi cảm thấy một chút xấu hổ và những câu dưới đây nảy sinh:
Có một sự khác biệt giữa:
system(...);
if ($? == -1) {
print "failed to execute: $!\n";
}
elsif ($? & 127) {
printf "child died with signal %d, %s coredump\n",
($? & 127), ($? & 128) ? 'with' : 'without';
}
else {
printf "child exited with value %d\n", $? >> 8;
}
và
my $rc = system(...);
if ($rc == -1) {
print "failed to execute: $!\n";
}
elsif ($rc & 127) {
printf "child died with signal %d, %s coredump\n",
($rc & 127), ($rc & 128) ? 'with' : 'without';
}
else {
printf "child exited with value %d\n", $rc >> 8;
}
Hoặc, đối với ngắn hạn, là $rc
bằng $?
cho system()
?
Tôi đã xem qua các tài liệu của system, wait và $? nhưng không rõ ràng đối với tôi. Tôi đã làm sai trong 15 năm qua bằng cách sử dụng $rc
?
Nếu bạn chụp kết quả cho '$ rc' không có cơ hội của' $ 'thay đổi trên bạn trước khi bạn nhận được xung quanh để? bằng cách sử dụng giá trị đó. – tadman
Cảm ơn @tadman. Tôi đã thêm nhận xét vào câu trả lời được chấp nhận cũng áp dụng cho nhận xét của bạn. Sử dụng '$ rc' có vẻ là cách sạch hơn với tôi. – PerlDuck