Как может, система Perl () печатает команду, которую она выполняет?

Вы можете использовать getActivity() , который возвращает активность, связанную с фрагментом. Активность - это контекст (поскольку Activity расширяет контекст) .

11
задан brian d foy 21 October 2009 в 10:36
поделиться

6 ответов

Как я понимаю, система () распечатает результат команды, но не присвоит его. Например.

[daniel@tux /]$ perl -e '$ls = system("ls"); print "Result: $ls\n"'
bin   dev  home  lost+found  misc  net  proc  sbin     srv  System  tools  var
boot  etc  lib   media       mnt   opt  root  selinux  sys  tmp     usr
Result: 0

Backticks получит вывод команды и не распечатает его:

[daniel@tux /]$ perl -e '$ls = `ls`; print "Result: $ls\n"'
Result: bin
boot
dev
etc
home
lib

и т.д...

Обновление: Если Вы хотите распечатать название команды, являющейся системой () 'd также, я думаю, что подход Rudd хорош. Повторенный здесь для консолидации:

sub execute {
    my $cmd = shift;
    print "$cmd\n";
    system($cmd);
}

my $cmd = $ARGV[0];
execute($cmd);
10
ответ дан 3 December 2019 в 01:24
поделиться

Я не знаю ни о каком способе по умолчанию сделать это, но можно определить подпрограмму, чтобы сделать это для Вас:

sub execute {
    my $cmd = shift;
    print "$cmd\n";
    system($cmd);
}

my $cmd = $ARGV[0];
execute($cmd);

И затем посмотрите его в действии:

pbook:~/foo rudd$ perl foo.pl ls
ls
file1   file2   foo.pl
19
ответ дан 3 December 2019 в 01:24
поделиться

Используйте открытый вместо этого. Затем можно получить вывод команды.

open(LS,"|ls");
print LS;
5
ответ дан 3 December 2019 в 01:24
поделиться

Вот обновленный, выполняются, который распечатает результаты и возвратит их:

sub execute {
  my $cmd = shift;
  print "$cmd\n";
  my $ret = `$cmd`;
  print $ret;
  return $ret;
}
4
ответ дан 3 December 2019 в 01:24
поделиться

Другая техника для объединения с другими упомянутыми в ответах состоит в том, чтобы использовать tee команда. Например:

open(F, "ls | tee /dev/tty |");
while (<F>) {
    print length($_), "\n";
}
close(F);

Это оба распечатает файлы в текущем каталоге (в результате tee /dev/tty) и также распечатайте продолжительность каждого чтения имени файла.

1
ответ дан 3 December 2019 в 01:24
поделиться

Хм, интересный, как различные люди отвечают на это различные пути. Это смотрит на меня как знак, и Daniel Fone интерпретировал его как желание видеть/управлять stdout команды (ни одно из их решений получают stderr fwiw). Я думаю, что Rudd стал ближе. Одно скручивание, которое Вы могли сделать на ответе Rudd, должно сверхобвинить созданный в системе () команда с Вашей собственной версией так, чтобы Вы не должны были бы переписывать существующий код для использования его выполнять () команду.

с помощью его выполняющихся () sub из сообщения Rudd, у Вас могло быть что-то вроде этого наверху Вашего кода:

if ($DEBUG) {
   *{"CORE::GLOBAL::system"} = \&{"main::execute"};
}

Я думаю, что это будет работать, но я должен признать, что это - вуду, и это было некоторое время, так как я написал этот код. Вот код, который я написал несколько лет назад для прерывания системных вызовов на локальном (вызов пространства имен) или глобальный уровень во время загрузки модуля:

  # importing into either the calling or global namespace _must_ be
  # done from import().  Doing it elsewhere will not have desired results.
  delete($opts{handle_system});
  if ($do_system) {
    if ($do_system eq 'local') {
      *{"$callpkg\::system"} = \&{"$_package\::system"};
    } else {
      *{"CORE::GLOBAL::system"} = \&{"$_package\::system"};
    }
  }
2
ответ дан 3 December 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: