attonie has asked for the wisdom of the Perl Monks concerning the following question:

The perl report "Can't call method "as_HTML" on an undefined value at m.pl line 27. ", The $stock_url are a HTML::ELEMENTS type same as the line 25, why report error ?

-------------------------------------------------
#!/usr/bin/perl use HTML::Tree; use HTML::Element; $url="http://biz.yahoo.com/research/earncal/today.html"; $file="/tmp/today.html"; $arg_2="-O$file"; system ( "wget", $url, $arg_2) ; print "Content-type: text/html \n\n"; $tree = HTML::TreeBuilder->new(); $tree->parse_file( $file ); @tables = $tree->find('table'); @stocks = @tables[5]->find('tr'); print "<b>Totally found ".scalar(@stocks)." Stocks.</b>"; print "<br><b>Fetching ...</b><br>"; for( $i = 3; $i < scalar(@stocks); $i++){ print @stocks[$i]->as_HTML; # line 25 $stock_url = @stocks[$i]->find('a'); print $stock_url->as_HTML; # line 27 }

Replies are listed 'Best First'.
Re: Why $stock_url->as_HTML report can't call method as_HTML ?
by Corion (Patriarch) on May 12, 2010 at 18:01 UTC

    To quote the HTML::Element documentation:

    In list context, returns a list of elements at or under $h that have any of the specified tag names. In scalar context, returns the first (in pre-order traversal of the tree) such element found, or undef if none.

    So, likely, the following code finds no element:

    @stocks[$i]->find('a');

    Maybe you want the following code?

    my $stock_url = @stocks[$i]->find('a') or die "Couldn't find a link in " . @stocks[$i]->as_HTML;

    As an aside, you better write it as

    $stocks[$i]->find('a');

    which Perl would also recommend, if you were running with warnings enabled.

    A reply falls below the community's threshold of quality. You may see it by logging in.