2014-03-27 4 views
0

У меня есть пример кода, как это:Как я могу вернуть эту системную команду в переменную?

#!usr/bin/perl -w 
my $path = shift; 
my $max_number_of_files = shift; 
print("Changing directory to path $path $!" . "\n"); 
chdir($path) or die "Cant chdir to $path $!"; 
print("Counting files..." . "\n"); 
counting(); 
sub counting { 
$counted = system("ls -1 | wc -l"); 
if ($counted > $max_number_of_files) { 
print("You have more or equal files"); 
return 1; 
} 
else { 
    print("$counted"); 
    print "You have less files"; 
    return 2; 
} 
} 

Но мое значение $ насчитал я думаю, не получить значение, которое система команд показать на консоль. Я проверил его, и он всегда равен нулю. Как я могу справиться с этим?

ответ

0

Возвращаемое значение system - это код выхода процесса, который вы вызывали по system, а не результат процесса.

Чтобы получить конечный результат процесса, используйте:

chomp($counted = `ls -1 | wc -l`); 
+0

Невозможно изменить скалярное chomp в скалярном назначении на строке Counter.pl 9, рядом с "' ls -1 | wc -l'; " это приводит к ошибке. Что делает chomp? – Hayra

+0

@ Хайра Упс, положение скобок было неправильным, теперь исправлено. FYI, 'chomp' избавляется от нового символа строки в конце строки. –

+0

это решило проблему, над которой я работаю. Благодаря! – Hayra

2

Это, как правило, считается плохой практикой для разбора вывода ls, потому что имена файлов могут содержать символы перевода строки, которые делают их охватывают более чем одну строку, а и wc будет сосчитать больше чем единожды.

Вы можете попробовать это:

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

my @files=<*>; 
print scalar(@files)," files\n"; 

Кроме того, с точки зрения переносимости, вы будете делать лучше, используя встроенные функции Perl, так как ls и wc могут быть недоступны на некоторых (например Windows) машин.

Смежные вопросы