2012-06-14 22 views
5

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ż.

Odpowiedz

3

To wydaje się być błędem w Perlu. Użyj raportu perlbug, aby to zgłosić.

1

Zamiast tego prawdopodobnie użyjesz IPC::Run.

use IPC::Run 'run'; 

run [ "ls", $dir ], ">", \my $stdout or die "Cannot run - $!"; 

Albo jeśli nie chcesz przechwytywać dane wyjściowe, system() może być lepsze

system("ls", $dir) == 0 or die "Cannot system - $!"; 
+1

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. –

+0

@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

+0

@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ę. –

Powiązane problemy