Я написал статью о том, как кешировать бобы 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;
}
}
Этот перехватчик используется в файле конфигурации пружины:
Надеюсь, что это поможет!
Нет, вы не можете сохранить значения вывода ls, поскольку система всегда выполняет команду как дочерний процесс, попробуйте использовать обратную кавычку `command`, которая выполняет команду в текущем процессе !
Поскольку он еще не был упомянут в других ответах, вы также можете использовать 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
Самый простой способ - использование обратных кавычек или qx()
:
my $value = qx(ls);
print $value;
Вывод аналогичен ls
.
Официальная документация Perl для встроенной функции системы гласит:
Это не то, что вы хотите использовать для захвата вывод команды, для вы должны использовать просто обратные кавычки или qx //, как описано в «
STRING
» в перлопе.
Существует множество способов легко получить доступ к документации:
perldoc -f
system
Если вы хотите, чтобы каждый список каталогов сохранялся в отдельном элементе массива, используйте:
my @entries = qx(ls);
Как сказал 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()
, которая добавляет больше проверки ошибок.
Мой ответ не касается вашего проблема. Однако, если вы ДЕЙСТВИТЕЛЬНО хотите сделать список каталогов, не вызывайте таким образом систему ls
. Используйте opendir () , readdir () или цикл while
.
Например,
while (<*>){
print $_ ."\n";
}
Фактически, если это не сторонняя проприетарная программа, всегда пытайтесь использовать собственные функции Perl.