如何使用你编写的perl模块?

发布于 2024-10-09 05:24:56 字数 3867 浏览 2 评论 0原文

我刚刚编写了我的第一个 Perl 模块,但无法让它与我也生成的脚本一起工作。这是当我尝试运行使用新创建的模块的脚本时 Perl 解释器显示的错误。

错误消息:

scraper_tools_v1.pm did not return a true value at getYid.pl line 5.
BEGIN failed--compilation aborted at getYid.pl line 5.

scraper_tools_v1.pm 是我编写的 Perl 模块, getYid.pl 是尝试利用 scraper_tools_v1.pm 模块的 Perl 脚本。

以下是 scraper_tools_v1.pm 文件的代码:

#!/usr/bin/perl

package scraper_tools_v1;

use strict;
use warnings;
use WWW::Curl::Easy;

# Note this function expects a single parameter which should be in the form of a URL

  sub getWebPage($)
  {
    # Setting up the Curl parameters
    my $curl = WWW::Curl::Easy->new; # create a variable to store the curl object

    # A parameter set to 1 tells the library to include the header in the body output.
    # This is only relevant for protocols that actually have headers preceding the data (like HTTP).
    $curl->setopt(CURLOPT_HEADER, 1);

    # Setting the target URL to retrieve with the passed parameter
    $curl->setopt(CURLOPT_URL, @_);

    # Declaring a variable to store the response from the Curl request
    my $response_body = '';

    # Creating a file handle for CURL to output to, then redirecting our output to the $response_body variable
    open(my $fileb, ">",\$response_body) or die $!;
    $curl->setopt(CURLOPT_WRITEDATA, $fileb);

    # getting the return code from the header to see if the GET was successful
    my $return_code = $curl->perform;

    # capturing the response code from the GET request in the HTTP header, i.e... 200, 404, 500, etc...
    # 200 is success
    my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);  

    # if the return code is zero than the request was a success
    if ($return_code == 0)
    {    
      # A little debug output to keep you informed
      print ("Success ". $response_code.": ".@_."\n");

      # return whatever was contained on the web page that we just got using a GET
      return $response_body;
    }

    else
    {
      print ("Failure ". $response_code.": ".@_."\n");
    }

    close($fileb); # close the file-handle

    }

这是尝试使用上述模块的 getYid.pl 脚本

#!/usr/bin/perl

use strict;
use warnings;
use scraper_tools_v1;

my %cat_links; # Hash that stores categories and their numbers (ID's)
my $web_page = scraper_tools_v1->getWebPage("http://something.com/categoryindex.aspx");

my @lines = split(/\n/, $web_page);

foreach my $line (@lines)
{
  chomp($line);

  if ($line =~ /<option value=\"{1}(.+)\">(.+)<\/option>/)
  {
    my $num = $1;
    my $desc = $2;
    $desc =~ s/\s+&amp;\s+/ & /;
    $cat_links{$desc} = $num;
  }
}

my @allTargetUrls; # make a new array to store all the links we need to extract listings from
$web_page = '';    # Reset this variable so we can reuse it.

my $totalNumberOfListings = 0;

foreach my $key (keys %cat_links)
{
  my $target = "http://something.com/categorydetail.aspx?id=$cat_links{$key}&exact_phrase=0";
  $web_page = scraper_tools_v1->getWebPage($target);

  @lines = split(/\n/, $web_page);

  foreach my $line (@lines)
  {
    my $pages;
    chomp($line);
    if ($line =~ /We found (\d) listings for your search\./)
    {
          my $listingsInCat = $1;
      print ("$cat_links{$key}, $listingsInCat");
      $totalNumberOfListings += $listingsInCat;
    }
    if ($line =~ /Page 1 of (\d)/)
    {
       $pages = $1;
    }

    for (my $i = 1; $i <= $pages; $i++)
    {
      #build the target urls
      my $pageUrl = "http://something.com/categorydetail.aspx?id=$key&search=&exact_phrase=True&city=&state=&zipcode=&page=$i";
      push(@allTargetUrls, $pageUrl);
    }
  }

  print("Total number of listings = ".$totalNumberOfListings);
} 

任何解决此问题的帮助将不胜感激,请注意,我已经独立测试了这两个文件的解释器错误和什么也没找到。感谢大家的观看。

I've just written my first Perl module and am having trouble getting it to work with a script I produced also. Here is the error that the Perl interpreter displays when I attempt to run the script that is using my newly created module.

Error message:

scraper_tools_v1.pm did not return a true value at getYid.pl line 5.
BEGIN failed--compilation aborted at getYid.pl line 5.

scraper_tools_v1.pm is the Perl module which I have written and getYid.pl is the Perl script which attempts to utilize the scraper_tools_v1.pm module.

Here is the code for the scraper_tools_v1.pm file:

#!/usr/bin/perl

package scraper_tools_v1;

use strict;
use warnings;
use WWW::Curl::Easy;

# Note this function expects a single parameter which should be in the form of a URL

  sub getWebPage($)
  {
    # Setting up the Curl parameters
    my $curl = WWW::Curl::Easy->new; # create a variable to store the curl object

    # A parameter set to 1 tells the library to include the header in the body output.
    # This is only relevant for protocols that actually have headers preceding the data (like HTTP).
    $curl->setopt(CURLOPT_HEADER, 1);

    # Setting the target URL to retrieve with the passed parameter
    $curl->setopt(CURLOPT_URL, @_);

    # Declaring a variable to store the response from the Curl request
    my $response_body = '';

    # Creating a file handle for CURL to output to, then redirecting our output to the $response_body variable
    open(my $fileb, ">",\$response_body) or die $!;
    $curl->setopt(CURLOPT_WRITEDATA, $fileb);

    # getting the return code from the header to see if the GET was successful
    my $return_code = $curl->perform;

    # capturing the response code from the GET request in the HTTP header, i.e... 200, 404, 500, etc...
    # 200 is success
    my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);  

    # if the return code is zero than the request was a success
    if ($return_code == 0)
    {    
      # A little debug output to keep you informed
      print ("Success ". $response_code.": ".@_."\n");

      # return whatever was contained on the web page that we just got using a GET
      return $response_body;
    }

    else
    {
      print ("Failure ". $response_code.": ".@_."\n");
    }

    close($fileb); # close the file-handle

    }

And here is the getYid.pl script which attempts to use the above module

#!/usr/bin/perl

use strict;
use warnings;
use scraper_tools_v1;

my %cat_links; # Hash that stores categories and their numbers (ID's)
my $web_page = scraper_tools_v1->getWebPage("http://something.com/categoryindex.aspx");

my @lines = split(/\n/, $web_page);

foreach my $line (@lines)
{
  chomp($line);

  if ($line =~ /<option value=\"{1}(.+)\">(.+)<\/option>/)
  {
    my $num = $1;
    my $desc = $2;
    $desc =~ s/\s+&\s+/ & /;
    $cat_links{$desc} = $num;
  }
}

my @allTargetUrls; # make a new array to store all the links we need to extract listings from
$web_page = '';    # Reset this variable so we can reuse it.

my $totalNumberOfListings = 0;

foreach my $key (keys %cat_links)
{
  my $target = "http://something.com/categorydetail.aspx?id=$cat_links{$key}&exact_phrase=0";
  $web_page = scraper_tools_v1->getWebPage($target);

  @lines = split(/\n/, $web_page);

  foreach my $line (@lines)
  {
    my $pages;
    chomp($line);
    if ($line =~ /We found (\d) listings for your search\./)
    {
          my $listingsInCat = $1;
      print ("$cat_links{$key}, $listingsInCat");
      $totalNumberOfListings += $listingsInCat;
    }
    if ($line =~ /Page 1 of (\d)/)
    {
       $pages = $1;
    }

    for (my $i = 1; $i <= $pages; $i++)
    {
      #build the target urls
      my $pageUrl = "http://something.com/categorydetail.aspx?id=$key&search=&exact_phrase=True&city=&state=&zipcode=&page=$i";
      push(@allTargetUrls, $pageUrl);
    }
  }

  print("Total number of listings = ".$totalNumberOfListings);
} 

Any help in resolving this issue would greatly be appreciated and please note that I have tested both files independently for interpreter errors and found nothing. Thanks to all for taking a look.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

阿楠 2024-10-16 05:24:56

结束文件

1;

当您编写 Perl 模块时,应始终以导入模块时 Perl 在模块级别执行代码行 。如果您不返回真值(1 为真),那么您将收到您所描述的错误。本质上,Perl 是在通知您模块中的初始化代码未成功。

When you write a Perl module, you should always end the file with the line

1;

Perl executes code at the module level when the module is imported. If you don't return a true value (1 is true), then you'll get the error you describe. Essentially, Perl is informing you that the initialisation code in your module didn't succeed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文