Wygląda na to, że zmienne w tyłach nie są rozszerzane po przekazaniu do funkcji readpipe. Jeśli przesłonię funkcję readpipe, jak mogę rozwinąć zmienne?Jak powiększać zmienne w programach obsługi pętli odczytu Perl?
BEGIN {
*CORE::GLOBAL::readpipe = sub {print "Run:@_\n"};
}
`ls /root`;
my $dir = "/var";
`ls $dir`;
Running to daje:
Run:ls /root
Run:ls $dir
Próbuję mock połączeń zewnętrznych dla kodu testowego, który piszę. Jeśli jest gdzieś moduł CPAN, który może pomóc w opiece nad tym wszystkim, to też mogłoby pomóc.
Aktualizacja:
zdecydowałem się użyć naprawdę brzydki obejście do mojego problemu. Okazuje się, że za pomocą readpipe()
zamiast backticks poprawnie rozwija zmienne. Korzystam z automatycznego czyszczenia skryptów przed uruchomieniem testów, które przekształcają wszystkie odsłuchy na readpipe()
przed uruchomieniem testów.
np Bieg:
$ cat t.pl
BEGIN {
*CORE::GLOBAL::readpipe = sub {print "Run:@_\n"};
}
`ls /root`;
my $dir = "/var";
`ls $dir`;
readpipe("ls $dir");
Daje:
$ perl t.pl
Run:ls /root
Run:ls $dir
Run:ls /var
ja wciąż patrząc na czystsze rozwiązanie chociaż.
Dzięki dla modułu nr ref. Jednak szukam łatwego sposobu na wyszydzanie wywołań systemowych, takich jak backticks i system(), aby uruchomić moje zmiany w dotychczasowym kodzie. –
@SandipBhattacharya Jestem pewien, że nie rozumiem problemu. backticks i exec nie zwracają żadnych wyników podczas działania systemu. czy eval i qx pasują do rachunku? – shinronin
@Shinronin Próbuję przesłonić/wyśmiewać listy w istniejącym kodzie, aby móc je bezpiecznie przetestować. Chociaż mogę zastąpić '* CORE :: GLOBAL :: readpipe', aby udawać odsunięcia, nie działają one w przypadkach, w których argument zawiera zmienne do rozwinięcia. Z powodu tego niespójnego zachowania między odsunięciami a 'readpipe()' trudno kpić z takiego kodu. Nie próbuję pisać nowego kodu. Gdybym to zrobił, użyłbym 'readpipe()' zamiast backticks, tak, żebym mógł wyśmiewać kod, jeśli chcę. –