perlquestion
stefan k
Fellow Monks,<br>
I must confess I am confused.
<p>
In one of my programs I concatenate some user-provided strings to build a file-match pattern which I then feed to <code>bsd_glob</code> from the File::Glob module. Then I need to detect whether it matched some files and proceed doing something with them. Sounds quite straightforward to me. But during this I ran into a strange runtime behaviour that I could boil down to the following test script:
<code>
#! /usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use File::Glob qw/:glob/;
# There lives a file "passwords.dat" in the current directory....
# This matches the whole filename. OK
my $pat1 = "passwords.dat";
print "\nPATT $pat1\n";
print "PRE ERR: ", Dumper($!);
my @list = bsd_glob($pat1, GLOB_ERR);
print Dumper(\@list);
print "POST ERR: ", Dumper($!);
print "\n";
# This file is not there so it doesn't match and afterwards $! ist
# set. OK
my $pat2 = "this_will_miss_in_globbing";
print "\nPATT $pat2\n";
print "PRE ERR: ", Dumper($!);
@list = bsd_glob($pat2, GLOB_ERR);
print Dumper(\@list);
print "POST ERR: ", Dumper($!);
print "\n";
# This should match again since it is just the same as the first match
# but *afterwards $! ist still set*!!??
my $pat3 = "passwords.dat";
print "\nPATT $pat3\n";
print "PRE ERR: ", Dumper($!);
@list = bsd_glob($pat3, GLOB_ERR);
print Dumper(\@list);
print "POST ERR: ", Dumper($!);
print "\n";
# This resets $! back to normal which is just fine
my $pat4 = "*.dat";
print "\nPATT $pat4\n";
print "PRE ERR: ", Dumper($!);
@list = bsd_glob($pat4, GLOB_ERR);
print Dumper(\@list);
print "POST ERR: ", Dumper($!);
print "\n";
</code>
Using <code>GLOB_ERR</code> or <code>GLOB_NOCHECK</code> or both of them changes nothing.
Now my questions are
<ul>
<li> Why is the variable <code>$!</code> not reset back to normal on successful glob with <code>$pat3</code>?
<li> How do I get <code>bsd_glob()</code> to do just that?
<li> What is The Right Way to check the outcome of <code>bsd_glob</code>?
</ul>
I assume that the error is on my side since this module is a core module which is even used to implement Perls <code>glob()</code> built-in.
<!-- Node text goes above. Div tags should contain sig only -->
<div class="pmsig"><div class="pmsig-5094">
<p>
<table width="80%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><small>Regards...</small></td>
<td align="right"><small>
<a href="http://www.skamphausen.de">stefan k</a>
</small></td>
</tr>
<tr>
<td colspan="2" align="center">
<small>you begin bashing the string with a +42 regexp of confusion</small>
</td>
</tr>
</table>
</div></div>