2016-04-04 2 views
0

Я написал небольшую функцию, которая преобразует шестнадцатеричное число в десятичное с помощью bc. При вызове напрямую он работает, однако, когда он вызывается несколько раз из одного оператора в другой функции, он терпит неудачу.Функция не имеет такого же поведения, если вызвана из функции

Вот демонстрационный сценарий, чтобы воспроизвести проблему:

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(); 
}' 

Вот результат этого:

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

Как вы можете видеть, когда выполняется непосредственно в BEGIN, он работает; однако при выполнении функции test() она терпит неудачу.

Я использую GNU Awk 3.1.5. Я также попробовал GNU Awk 4.1.1 на другой машине, он не работает аналогичным образом.

ответ

2

Проблема в том, что вы не закрыли трубу после cmd|getline d.

добавления

close(cmd) 

после getline должны исправить вашу проблему. getline следует использовать с осторожностью.

P.S. printf в awk - это утверждение, а не функция.

+0

Ничего себе, хорошо. Я не понимал вашу P.S. хоть. –

+0

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

+0

О, я вижу. Я просто нахожу это более ясным, но я думаю, что более строго опустить круглые скобки. Спасибо за это замечание. –

Смежные вопросы