Here's what I have:
Nice fragment :) here is a complete program
#!/usr/bin/perl --
use strict;
use warnings;
use HTML::TreeBuilder;
Main(@ARGV);
exit(0);
sub Main {
my $html = '<html><body>
<img src="0" alt="0">
<img src="1" alt="1">
<img src="2" alt="2">
<img src="3" alt="">
<img src="4">
<img src="5">
</body></html>';
my $tree = HTML::TreeBuilder->new();
$tree->parse($html);
local $\ = $/;
print $_->as_HTML
for $tree->look_down( qw' _tag img ',
sub { not defined $_[0]->attr('alt') } );
print '---';
print $_->as_HTML
for $tree->look_down( qw' _tag img ',
sub { not length $_[0]->attr('alt') } );
print '---';
$_->attr( alt => MAlt($_) )
for $tree->look_down( qw' _tag img ',
sub { not length $_[0]->attr('alt') } );
print $_->as_HTML for $tree->look_down(qw' _tag img ');
} ## end sub Main
sub MAlt { '!' . $_[0]->attr('src') }
__END__
<img src="4" />
<img src="5" />
---
<img alt="" src="3" />
<img src="4" />
<img src="5" />
---
<img alt="0" src="0" />
<img alt="1" src="1" />
<img alt="2" src="2" />
<img alt="!3" src="3" />
<img alt="!4" src="4" />
<img alt="!5" src="5" />
Alternatively, try
HTML::TreeBuilder::XPath
#!/usr/bin/perl --
use strict;
use warnings;
use HTML::TreeBuilder::XPath;
Main(@ARGV);
exit(0);
sub Main {
my $html = '<html><body>
<img src="0" alt="0">
<img src="1" alt="1">
<img src="2" alt="2">
<img src="3" alt="">
<img src="4">
<img src="5">
</body></html>';
my $tree = HTML::TreeBuilder::XPath->new();
$tree->parse($html);
local $\ = $/;
print $_->as_HTML for $tree->findnodes('//img[not(@alt)]');
print '---';
print $_->as_HTML for $tree->findnodes('//img[not(string-length(@a
+lt))]');
print '---';
$_->attr( alt => MAlt($_) )
for $tree->findnodes('//img[not(string-length(@alt))]');
print $_->as_HTML for $tree->findnodes('//img');
} ## end sub Main
sub MAlt { '!' . $_[0]->attr('src') }
__END__