How can I assign a variable using $expect_out in TCL/EXPECT?
Asked Answered
T

3

9

If I want to match DEF_23 using the following regexp:

expect {
    -re "DEF_\[0-9]*"
    set result $expect_out(1,string)
}

why does it say no such element in array? How does $expect_out work, and how can I capture the DEF using a regexp and assign it to the variable result?

Temperance answered 15/6, 2012 at 13:16 Comment(1)
Did you mean to have extra braces around the set line? Otherwise it's a very strange use of expect indeed…Eleonoreleonora
Q
14

You're looking for expect_out(0,string) -- the array element 1,string would be populated if you had capturing parentheses in your regular expression.

The expect manpage documents the use of expect_out in the documentation of the expect command:

Upon matching a pattern (or eof or full_buffer), any matching and previously unmatched output is saved in the variable expect_out(buffer). Up to 9 regexp substring matches are saved in the variables expect_out(1,string) through expect_out(9,string). If the -indices flag is used before a pattern, the starting and ending indices (in a form suitable for lrange) of the 10 strings are stored in the variables expect_out(X,start) and expect_out(X,end) where X is a digit, corresponds to the substring position in the buffer. 0 refers to strings which matched the entire pattern and is generated for glob patterns as well as regexp patterns.

There is an illustrative example in the manpage.

Quiteria answered 15/6, 2012 at 15:26 Comment(0)
E
1

It seems that the above explication is not precise! Check this example:

$ cat test.exp
#!/usr/bin/expect

set timeout 5
log_user 0

spawn bash

send "ls -1 db*\r"
expect {
  -re "^db.*$" {
    set bkpfile $expect_out(0,string)
  }
}

send_user "The filename is: $bkpfile\n"

close
$ ls -1 db*
dbupgrade.log
$ ./test.exp
can't read "bkpfile": no such variable
    while executing
"send_user "The filename is: $bkpfile\n""
    (file "./test.exp" line 15)
$

The test result is the same when $expect_out(1,string) or $expect_out(buffer)is used. Am I missing something or this is the expected behavior?

Elea answered 23/10, 2014 at 3:7 Comment(1)
If somebody is still curious why this example above does not work, check answer: https://mcmap.net/q/1173731/-regular-expressions-in-expectDynamoelectric
C
0

Aleksandar - it should work if you change the match to "\ndb.*$".

If you turn on exp_internal 1, you will see the buffer contains something like this: "ls -1 db*\r\ndbupgrade.log\r\n08:46:09"

So, the caret (^) will throw your pattern match off.

Countess answered 22/6, 2016 at 13:49 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.