2016-04-04 30 views
0

bc'u kullanarak onaltılık bir sayıyı ondalık sayıya dönüştüren küçük bir işlev yazdım. Doğrudan çağrıldığında, çalışır, ancak başka bir işlevde tek bir deyimden birden çok kez çağrıldığında, başarısız olur. İşte İşlev, bir işlevden çağrıldığında aynı davranışı göstermiyor

awk 'function hd(h) { 
    cmd=sprintf("echo \"ibase=16; obase=A; %s\"|bc", h); 
    cmd|getline d; 
    printf("hd(%s)=%s\n", h, d); 
    return d; 
} 
function test() { 
    printf("A=%d, FF=%d\n", hd("A"), hd("FF")); 
} 
BEGIN { 
    printf("A=%d, FF=%d\n", hd("A"), hd("FF")); 
    test(); 
}' 

bu çıktısı:: İşte

sorunu yeniden oluşturmak için bir demo senaryo

hd(A)=10 
hd(FF)=255 
A=10, FF=255 
hd(A)=255 
hd(FF)=255 
A=255, FF=255 

Gördüğünüz gibi, işe yarıyor BEGIN doğrudan infaz; Ancak, test() işlevi aracılığıyla yürütüldüğünde, başarısız olur.

GNU Awk 3.1.5 kullanıyorum. GNU Awk 4.1.1'i başka bir makinede denedim, benzer bir şekilde başarısız oluyor.

cevap

2

Sorun şu ki, boruyu cmd|getline d'dan sonra kapatmadınız.

getline sonra

close(cmd) 

ekleyerek sorununuzu çözecektir. getline dikkatli kullanılmalıdır.

P.S. Awk içinde printf bir ifadedir, bir işlev değildir.

+0

Vay, güzel. Ben senin P.S'yi anlamadım. gerçi. –

+0

@BenoitDuffez 'printf"% d ", 5' vs' printf ("% d", 5) ' – Kent

+0

Oh, anladım. Ben sadece daha net buluyorum, ama parantezi atlamak daha doğru sanırım. Bu konu için teşekkürler. –

İlgili konular