Как я могу сохранить вывод системной функции Perl к переменной?

Я написал статью о том, как кешировать бобы JSF с помощью Spring AOP.

Я создаю простой MethodInterceptor, который перехватывает все методы, аннотированные специальной аннотацией:

public class CacheAdvice implements MethodInterceptor {

private static Logger logger = LoggerFactory.getLogger(CacheAdvice.class);

@Autowired
private CacheService cacheService;

@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {

    String key = methodInvocation.getThis() + methodInvocation.getMethod().getName();

    String thread = Thread.currentThread().getName();

    Object cachedValue = cacheService.getData(thread , key);

    if (cachedValue == null){
        cachedValue = methodInvocation.proceed();
        cacheService.cacheData(thread , key , cachedValue);
        logger.debug("Cache miss " + thread + " " + key);
    }
    else{
        logger.debug("Cached hit " + thread + " " + key);
    }
    return cachedValue;
}


public CacheService getCacheService() {
    return cacheService;
}
public void setCacheService(CacheService cacheService) {
    this.cacheService = cacheService;
}

}

Этот перехватчик используется в файле конфигурации пружины:

    
    
        
            
                
            
            
        
    
    
        
    

Надеюсь, что это поможет!

26
задан brian d foy 28 March 2010 в 18:58
поделиться

6 ответов

Нет, вы не можете сохранить значения вывода ls, поскольку система всегда выполняет команду как дочерний процесс, попробуйте использовать обратную кавычку `command`, которая выполняет команду в текущем процессе !

20
ответ дан 28 November 2019 в 06:35
поделиться

Поскольку он еще не был упомянут в других ответах, вы также можете использовать Capture :: Tiny для сохранения любого произвольного STDOUT (и / или STDERR) в переменной, в том числе из системной команды.

use strict;
use warnings;
use Capture::Tiny 'capture_stdout';
my ($stdout, $return) = capture_stdout { system 'ls' };
# error checking for system return value required here
0
ответ дан Grinnz 28 November 2019 в 06:35
поделиться

Самый простой способ - использование обратных кавычек или qx():

my $value = qx(ls);
print $value;

Вывод аналогичен ls.

16
ответ дан brian d foy 28 November 2019 в 06:35
поделиться

Официальная документация Perl для встроенной функции системы гласит:

Это не то, что вы хотите использовать для захвата вывод команды, для вы должны использовать просто обратные кавычки или qx //, как описано в « STRING » в перлопе.

Существует множество способов легко получить доступ к документации:

  1. Из командной строки: perldoc -f system
  2. Онлайн на perldoc.perl.org .
  3. Искать в Интернете с помощью Google.

Если вы хотите, чтобы каждый список каталогов сохранялся в отдельном элементе массива, используйте:

my @entries = qx(ls);
7
ответ дан 28 November 2019 в 06:35
поделиться

Как сказал abubacker, вы можете использовать обратные знаки, чтобы записать вывод программы в переменную для последующего использования. Однако, если вам также нужно проверить исключительные значения возврата или обойти вызов оболочки, пришло время ввести в CPAN модуль, IPC::System::Simple:

use IPC::System::Simple qw(capture);

# Capture output into $result and throw exception on failure
my $result = capture("some_command"); 

Этот модуль можно вызывать различными способами, и он позволяет вам настроить, какие значения возврата ошибок являются "приемлемыми", обходить ли оболочку или нет, и как обрабатывать группировку аргументов. Он также обеспечивает замену system(), которая добавляет больше проверки ошибок.

9
ответ дан 28 November 2019 в 06:35
поделиться

Мой ответ не касается вашего проблема. Однако, если вы ДЕЙСТВИТЕЛЬНО хотите сделать список каталогов, не вызывайте таким образом систему ls . Используйте opendir () , readdir () или цикл while .

Например,

while (<*>){
    print $_ ."\n";
}

Фактически, если это не сторонняя проприетарная программа, всегда пытайтесь использовать собственные функции Perl.

10
ответ дан 28 November 2019 в 06:35
поделиться
Другие вопросы по тегам:

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