2013-03-18 10 views
5

Piszę niektóre dane i organizuję je, a teraz muszę przechwycić je wewnątrz zmiennej.Perl dołącza wyjście printf do łańcucha

Nigdy wcześniej nie używałem printf ani sprintf.

Używam printf w sposób, jak to zorganizować dane:

printf("%-30s %18s %18s\n", "$a", "$b", "$c\n"); 

Teraz mam zmienną, która jest przechowywanie ciąg, i chcę dołączyć zorganizowanych danych do zmiennej $ result.

Próbowałem coś podobnego

$result.printf("%-30s %18s %18s\n", "$a", "$b", "$c\n"); 

i to nie działa. Próbowałem też sprintf.

Wszelkie pomysły?

Dzięki, S

+6

myślę mówić za wszystkich tutaj, kiedy mówię „nie robi praca "to trzecia najmniej pomocna wiadomość diagnostyczna wszechczasów. Powiedz nam, czego się spodziewałeś i powiedz nam, co się właściwie wydarzyło. – mob

+2

@mob Jestem ciekawy: jakie dwie najlepsze są najmniej przydatne? – TLP

+1

Czy ludzie mogą prosić o zaprzestanie pakowania samotnych zmiennych za pomocą cytatów? Czy zrobiłbyś to w C lub Pythonie? Dlaczego robisz to w Perlu? Nazwijmy to "Bezużyteczne użycie interpolacji zmiennej". Ponadto masz \ n zarówno w swoim ciągu formatującym, jak i ostatnim argumencie do printf. Czy naprawdę chciałeś, aby w twoim pliku wyjściowym były dwa kanały? – runrig

Odpowiedz

1

Nie wiem co masz na myśli przez „próbował sprintf zbyt”, ponieważ nie ma powodu, to nie będzie działać, jeśli zrobisz to dobrze. Chociaż ta składnia, którą pokazałeś, nie przypomina perla, bardziej jak python czy rubin?

my $foo = sprintf("%-30s %18s %18s\n", "$a", "$b", "$c\n"); 
$result .= $foo; 
+0

Głosuję na 'python' =) Zrób zakład. –

+0

Dzięki za pomoc. Tak, przepraszam za brak specyfiki w "to nie działa". Powinienem być bardziej konkretny. To zadziałało, albo udało mi się zapisać formatowanie sprintf wewnątrz zmiennej do dołączenia do pliku .txt, dodając zmienną do zmiennej, tak jak pokazano, dodając instrukcję sprintf do zmiennej, którą próbowałem wykonać. – user1610717

+1

@ user1610717 '$ foo' jest po prostu zmienną przejściową, można równie łatwo dołączyć' sprintf'. – TLP

8

printf wyprowadza skonstruowany ciąg określonym uchwytem (lub bieżącej standardowego, jeżeli pominięto) i zwraca wartość logiczną, która wskazuje, czy wystąpił błąd IO czy nie. Nieprzydatne. sprintf zwraca skonstruowany ciąg, więc tego chcesz.

Aby złączyć dwa ciągi (dołączyć jeden do drugiego), jeden używa operatora . (lub join)

$result . sprintf(...) 

Ale mówiłeś, to nie zadziała. Można przypuszczać, że to dlatego, że chcemy także do przechowywania wytworzonej ciąg w $result, co można zrobić przy użyciu

$result = $result . sprintf(...); 

lub krótszy

$result .= sprintf(...);