0

$expect_out(1, string) を使用して、次の例のサブパターン グループ 1 を出力しようとしました。しかし、プログラムは "$expect_out(1, string)" を取りませんでした。代わりに (1,string) を出力しました (以下の出力を参照)。

サブパターン グループ 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 バス

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, string)

4

1 に答える 1

2

すばやく簡単に解決するには、関数$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";
于 2013-01-12T09:34:44.243 に答える