Perl   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了学习高阶Perl:迭代器问题大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我研究了高阶Perl书,并在第4.3.4章中讨论了迭代器问题.

代码:

@H_840_2@main_script.pl

#!/perl
use Strict;
use warnings;

use FindBin qw($Bin);
use lib $Bin;
use Iterator_Utils qw(:all);
use FlatDB;

my $db = FlatDB->new("$Bin/db.csv") or die "$!";
my $q = $db->query('STATE','NY');
while (my $rec = NEXTVAL($q) )
{
     print $rec;
}

Iterator_Utils.pm

#!/perl
use Strict;
use warnings;
package Iterator_Utils;
use Exporter 'import';;
our @EXPORT_OK = qw(NEXTVAL Iterator
            append imap igrep
            iterate_function filehandle_iterator list_iterator);
our %EXPORT_TAGS = ('all' => \@EXPORT_OK);
sub NEXTVAL { $_[0]->() }
sub Iterator (&) { return $_[0] }

FlatDB.pm

#!/perl
use Strict;
use warnings;

package FlatDB;

my $FIELDSEP = qr/:/;

sub new 
{
    my $class = shift;
    my $file = shift;

    open my $fh,"<",$file or return;
    chomp(my $scheR_197_11845@a = <$fh>);

    my @field = split $FIELDSEP,$scheR_197_11845@a;
    my %fieldnum = map { uc $field[$_] => $_ } (0..$#field);
   bless 
   { 
       FH => $fh,FIELDS => \@field,FIELDNUM => \%fieldnum,FIELDSEP => $FIELDSEP 
   } => $class;
}

use Fcntl ':seek';
sub query 
{
     my $self = shift;
     my ($field,$value) = @_;
     my $fieldnum = $self->{FIELDNUM}{uc $fielD};
     return unless defined $fieldnum;
     my $fh = $self->{FH};
     seek $fh,SEEK_SET;
     <$fh>; # discard scheR_197_11845@a line
     return Iterator 
     {
       local $_;
       while (<$fh>) 
       {
            chomp;
            my @fields = split $self->{FIELDSEP},$_,-1;
            my $fieldval = $fields[$fieldnum];
            return $_ if $fieldval eq $value;
       }
       return;
    };
 }

db.csv

LASTNAME:FIRSTNAME:CITY:STATE:OWES
Adler:David:New York:NY:157.00
Ashton:Elaine:Boston:MA:0.00
Dominus:Mark:Philadelphia:PA:0.00
Orwant:Jon:Cambridge:MA:26.30
Schwern:Michael:New York:NY:149658.23
Wall:Larry:Mountain View:CA:-372.14

就像到目前为止的书一样,对吗?但是我没有得到输出(应该出现Adler和Schwern的字符串).错误消息是:

Can't use String ("Adler:David:New York:NY:157.00") as a subroutIne ref while 
"Strict refs" in use at N:/Perle/Learn/Iterators/Iterator_Utils.pm line 12,<$fh> 
line 3.

我究竟做错了什么?

提前致谢!

解决方法

FlatDB调用Iterator,它在Iterator_Utils中定义,因此它需要从Iterator_Utils导入该函数.如果你添加
use Iterator_Utils qw(Iterator);

在包FlatDB之后,该程序将起作用.

非常感谢您发现此错误.我将此添加到the errata on the web site.如果您希望通过名称记入帐户,请将您的姓名发送给我.

大佬总结

以上是大佬教程为你收集整理的学习高阶Perl:迭代器问题全部内容,希望文章能够帮你解决学习高阶Perl:迭代器问题所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。