我尝试使用$ expect_out(1,string)打印出以下示例中的子模式组1;但该程序没有采取“$ expect_out(1,string)”。相反,它打印出来(1,字符串)(见下面的输出)。
关于如何打印子模式组1(即“SunOS”)的任何想法。
我将括号放在搜索模式中以指示组1进行反向引用; 和内部调试(在输出中)似乎表明它正确地捕获了这个短语,但我不知道如何将其打印出来。
谢谢,
#!/usr/bin/perl
use Expect;
my $exp = new Expect;
# Begin: 2 lines for debugging only
$exp->exp_internal(1);
$exp->log_file("./expect_log.txt");
# End: 2 lines for debugging only
$exp->spawn("uname -a");
$exp->expect(10, '-re', "^(SunOS).*") or print "\nNot found!\n";
print "$expect_out(1, string)\n";
unix-machine% test_expect.pl
SunOS unix-machine 5.12 Generic_000000-00 sun4u sparc SUNW,SPARC-Bus
(1, string)
86 unix-machine% test_expect.pl
Spawned 'uname -a'
spawn id(3)
Pid: 25613
Tty: /dev/pts/169
at /home/user/PERL/lib/Expect.pm line 181
Expect::spawn('Expect=GLOB(0x2b2040)', 'uname -a') called at test_expect.pl line 10
Starting EXPECT pattern matching...
at /home/user/PERL/lib/Expect.pm line 561
Expect::expect('Expect=GLOB(0x2b2040)', 10, '-re', '^(SunOS).*') called at test_expect.pl line 11
spawn id(3): list of patterns:
#1: -re `^(SunOS).*'
spawn id(3):'
match:
pattern #1: -re
^(SunOS)。*'?否。
SunOS unix-machine 5.10 Generic_000000-00 sun4u sparc SUNW,SPARC-Bus
spawn id(3):SunOS unix-machine 5.12 Generic_000000-00 sun4u sparc SUNW,SPARC-Bus\r\n'
match:
pattern #1: -re
^(SunOS)。*'?是!!
在匹配字符串之前:'
Match string:
SunOS unix-machine 5.12 Generic_000000-00 sun4u sparc SUNW,SPARC-Bus \ r'
匹配字符串后:\n'
Matchlist: (
SunOS')
(1,字符串)
答案 0 :(得分:1)
要获得快速直接的解决方案,请使用 $ exp-> matchlist 功能。如果你愿意,你可以继续阅读。
“$ expect_out(1,string)”适用于expect脚本但不适用于Perl脚本,因为Perl解释器会将$ expect_out视为标量变量,将以下“(1,string)”视为原始字符串。您可以参考Perl和PHP如何使用双引号中的字符串进行详细说明。
有关如何使用Perl的Expect.pm模块的详细信息,请参阅CPAN: Expect.pm
进入此页面并搜索“括号”,您将知道 $ exp-> matchlist 功能可以解决问题。
所以将脚本更改为:
#!/usr/bin/perl
use Expect;
my $exp = new Expect;
## Begin: 2 lines for debugging only
$exp->exp_internal(1);
$exp->log_file("./expect_log.txt");
## End: 2 lines for debugging only
$exp->spawn("uname -a");
$exp->expect(10, '-re', "^(SunOS).*") or print "\nNot found!\n";
#print $expect_out(1, string);
print ${$exp->matchlist}[0],"\n";