首页 > 解决方案 > 使用 `atom` 运行 perl 代码会抛出未定义的子例程 &main::send_request

问题描述

我正在perl为要求编写我的第一个脚本

use HTTP::Request::Generator 'generate_requests';
use URI;
use HTTP::Request::Common;
use strict; # safety net
use warnings; # safety ne
use Test::LWP::UserAgent 'send_request';
use LWP::UserAgent 'send_request';
use Test::More;
use URI;
use HTTP::Request::Common;
use LWP::UserAgent;



my $g = generate_requests(
    method => 'POST',
    host   => ['example.com','www.example.com'],
    pattern => 'https://example.com/{bar,foo,gallery}/[00..99].html',


    wrap => sub {
        my( $req ) = @_;
        # Fix up some values
        $req->{headers}->{'Content-Length'} = 666;
    },
);
while( my $r = $g->()) {
    send_request( $r );
};

我正在使用atom编辑器,activeperl在 Windows 10 上,运行上述代码时出现以下错误。

Undefined subroutine &main::send_request called at C:\Users\ADMINI~1\AppData\Local\Temp\atom_script_tempfiles\0ac821e0-0886-11eb-9588-291dbc37d883 line 57.

我已经安装了所有必要的模块和库,但我认为它无法引用该方法send_request。请协助。

注意 出于隐私原因,我已经替换了变量中的实际值。

更新

我计划使用 pattern => 'https://example.{com,org,net}/page_[00..99].html',https://metacpan.org/pod/HTTP::Request::Generator 的以下模块。

标签: perl

解决方案


LWP::UserAgent 是一个面向对象的模块。它不导出函数。你想这样打电话send_request

my $ua = 'LWP::UserAgent'->new;

while ( my $r = $g->() ) {
    $ua->send_request( $r );
}

也就是说,send_request是一种未记录的内部方法。我认为它可能更适用于继承 LWP::UserAgent 的人。您可能需要该request方法。

my $ua = 'LWP::UserAgent'->new;

while ( my $r = $g->() ) {
    my $response = $ua->request( $r );
}

完整代码:

use strict;
use warnings;
use HTTP::Request::Generator 'generate_requests';
use LWP::UserAgent;

my $ua = 'LWP::UserAgent'->new;

my $gen = generate_requests(
    method  => 'POST',
    host    => [ 'example.com', 'www.example.com' ],
    pattern => 'https://example.com/{bar,foo,gallery}/[00..99].html',
    wrap    => sub {
        my ( $req ) = @_;
        # Fix up some values
        $req->{'headers'}{'Content-Length'} = 666;
    },
);

while ( my $req = $gen->() ) {
    my $response = $ua->request( $req );
    
    # Do something with $response here?
}

推荐阅读