Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Perl > Perl Misc > using file globs and regex

Reply
Thread Tools

using file globs and regex

 
 
pgodfrin
Guest
Posts: n/a
 
      08-07-2009
Greetings,
This program works fine (with file names f1..f8 in the directory):

#!/usr/bin/perl
use warnings;
use strict;
$\="\n";
while(<f*>)
{
print "$_";
if(/f5/)
{
my $fn=$_;
print "File name $fn found..." and exit;
}
}
exit;

But I was hoping to be able to do something like:
my $fn=grep (/f5/,<f*>);

Basically just trying to have less lines of code...any suggestions?
phil g
 
Reply With Quote
 
 
 
 
pgodfrin
Guest
Posts: n/a
 
      08-07-2009
Thanks Tad - works like a charm...
pg

On Aug 7, 12:06*pm, Tad J McClellan <ta...@seesig.invalid> wrote:
> pgodfrin <pgodf...@gmail.com> wrote:
> > Greetings,
> > This program works fine (with file names f1..f8 in the directory):

>
> > #!/usr/bin/perl
> > use warnings;
> > use strict;
> > $\="\n";
> > while(<f*>)
> > {
> > * * print "$_";
> > * * if(/f5/)
> > * * {
> > * * * * my $fn=$_;
> > * * * * print "File name $fn found..." and exit;
> > * * }
> > }
> > exit;

>
> > But I was hoping to be able to do something like:
> > my $fn=grep (/f5/,<f*>);

>
> > Basically just trying to have less lines of code...any suggestions?

>
> use grep() in a list context instead of in a scalar context.
>
> I don't like using overloaded angle brackets in my code.
>
> If I want equality, I use an operator that tests for equality.
>
> * * my($fn) = grep ( $_ eq 'f5' , glob 'f*');
>
> --
> Tad McClellan
> email: perl -le "print scalar reverse qq/moc.noitatibaher\100cmdat/"


 
Reply With Quote
 
 
 
 
pgodfrin
Guest
Posts: n/a
 
      08-07-2009
hmmm - what if I wanted to do some search on the glob?
like my($fn) = grep ( /5/ , glob 'f*');
?
pg
On Aug 7, 12:23*pm, pgodfrin <pgodf...@gmail.com> wrote:
> Thanks Tad - works like a charm...
> pg
>
> On Aug 7, 12:06*pm, Tad J McClellan <ta...@seesig.invalid> wrote:
>
> > pgodfrin <pgodf...@gmail.com> wrote:
> > > Greetings,
> > > This program works fine (with file names f1..f8 in the directory):

>
> > > #!/usr/bin/perl
> > > use warnings;
> > > use strict;
> > > $\="\n";
> > > while(<f*>)
> > > {
> > > * * print "$_";
> > > * * if(/f5/)
> > > * * {
> > > * * * * my $fn=$_;
> > > * * * * print "File name $fn found..." and exit;
> > > * * }
> > > }
> > > exit;

>
> > > But I was hoping to be able to do something like:
> > > my $fn=grep (/f5/,<f*>);

>
> > > Basically just trying to have less lines of code...any suggestions?

>
> > use grep() in a list context instead of in a scalar context.

>
> > I don't like using overloaded angle brackets in my code.

>
> > If I want equality, I use an operator that tests for equality.

>
> > * * my($fn) = grep ( $_ eq 'f5' , glob 'f*');

>
> > --
> > Tad McClellan
> > email: perl -le "print scalar reverse qq/moc.noitatibaher\100cmdat/"

>
>


 
Reply With Quote
 
pgodfrin
Guest
Posts: n/a
 
      08-07-2009
OK - I figured it out - thanks.

This works fine: my($fn2) = grep ( $_ =~ '6' , glob 'f*');

What I'm confused about is the parens around the $fn2 ? Why are those
needed? Something tells me that has something to do with making the
scalar $fn2 into a list 'cause that's what grep returns, but i can't
remember what that's called to look it up.

help?
pg


On Aug 7, 1:23*pm, pgodfrin <pgodf...@gmail.com> wrote:
> hmmm - what if I wanted to do some search on the glob?
> like my($fn) = grep ( /5/ , glob 'f*');
> ?
> pg
> On Aug 7, 12:23*pm, pgodfrin <pgodf...@gmail.com> wrote:
>
> > Thanks Tad - works like a charm...
> > pg

>
> > On Aug 7, 12:06*pm, Tad J McClellan <ta...@seesig.invalid> wrote:

>
> > > pgodfrin <pgodf...@gmail.com> wrote:
> > > > Greetings,
> > > > This program works fine (with file names f1..f8 in the directory):

>
> > > > #!/usr/bin/perl
> > > > use warnings;
> > > > use strict;
> > > > $\="\n";
> > > > while(<f*>)
> > > > {
> > > > * * print "$_";
> > > > * * if(/f5/)
> > > > * * {
> > > > * * * * my $fn=$_;
> > > > * * * * print "File name $fn found..." and exit;
> > > > * * }
> > > > }
> > > > exit;

>
> > > > But I was hoping to be able to do something like:
> > > > my $fn=grep (/f5/,<f*>);

>
> > > > Basically just trying to have less lines of code...any suggestions?

>
> > > use grep() in a list context instead of in a scalar context.

>
> > > I don't like using overloaded angle brackets in my code.

>
> > > If I want equality, I use an operator that tests for equality.

>
> > > * * my($fn) = grep ( $_ eq 'f5' , glob 'f*');

>
> > > --
> > > Tad McClellan
> > > email: perl -le "print scalar reverse qq/moc.noitatibaher\100cmdat/"

>
>


 
Reply With Quote
 
Steve C
Guest
Posts: n/a
 
      08-07-2009
- SC.

then it asks grep for a scalar.
but when you call it without the parens
it asks grep for a list
When you put $fn2 inside the parens then
It's called list context.

pgodfrin wrote:
> OK - I figured it out - thanks.
>
> This works fine: my($fn2) = grep ( $_ =~ '6' , glob 'f*');
>
> What I'm confused about is the parens around the $fn2 ? Why are those
> needed? Something tells me that has something to do with making the
> scalar $fn2 into a list 'cause that's what grep returns, but i can't
> remember what that's called to look it up.
>
> help?
> pg
>
>
> On Aug 7, 1:23 pm, pgodfrin <pgodf...@gmail.com> wrote:
>> hmmm - what if I wanted to do some search on the glob?
>> like my($fn) = grep ( /5/ , glob 'f*');
>> ?
>> pg
>> On Aug 7, 12:23 pm, pgodfrin <pgodf...@gmail.com> wrote:
>>
>>> Thanks Tad - works like a charm...
>>> pg
>>> On Aug 7, 12:06 pm, Tad J McClellan <ta...@seesig.invalid> wrote:
>>>> pgodfrin <pgodf...@gmail.com> wrote:
>>>>> Greetings,
>>>>> This program works fine (with file names f1..f8 in the directory):
>>>>> #!/usr/bin/perl
>>>>> use warnings;
>>>>> use strict;
>>>>> $\="\n";
>>>>> while(<f*>)
>>>>> {
>>>>> print "$_";
>>>>> if(/f5/)
>>>>> {
>>>>> my $fn=$_;
>>>>> print "File name $fn found..." and exit;
>>>>> }
>>>>> }
>>>>> exit;
>>>>> But I was hoping to be able to do something like:
>>>>> my $fn=grep (/f5/,<f*>);
>>>>> Basically just trying to have less lines of code...any suggestions?
>>>> use grep() in a list context instead of in a scalar context.
>>>> I don't like using overloaded angle brackets in my code.
>>>> If I want equality, I use an operator that tests for equality.
>>>> my($fn) = grep ( $_ eq 'f5' , glob 'f*');
>>>> --
>>>> Tad McClellan
>>>> email: perl -le "print scalar reverse qq/moc.noitatibaher\100cmdat/"

>>

>

 
Reply With Quote
 
Xho Jingleheimerschmidt
Guest
Posts: n/a
 
      08-08-2009
Tad J McClellan wrote:
> pgodfrin <> wrote:
>> Greetings,
>> This program works fine (with file names f1..f8 in the directory):
>>
>> #!/usr/bin/perl
>> use warnings;
>> use strict;
>> $\="\n";
>> while(<f*>)
>> {
>> print "$_";
>> if(/f5/)
>> {
>> my $fn=$_;
>> print "File name $fn found..." and exit;
>> }
>> }
>> exit;
>>
>> But I was hoping to be able to do something like:
>> my $fn=grep (/f5/,<f*>);
>>
>> Basically just trying to have less lines of code...any suggestions?

>
>
> use grep() in a list context instead of in a scalar context.
>
> I don't like using overloaded angle brackets in my code.
>
> If I want equality, I use an operator that tests for equality.
>
> my($fn) = grep ( $_ eq 'f5' , glob 'f*');


Or just don't remove the equality in the first place.

my($fn) = glob 'f5';

Although it seems like a file test operator would make more sense here.

Xho


 
Reply With Quote
 
pgodfrin
Guest
Posts: n/a
 
      08-10-2009
On Aug 7, 3:44*pm, Ben Morrow <b...@morrow.me.uk> wrote:
> [please don't top-post]
>
> Quoth pgodfrin <pgodf...@gmail.com>:
>
> > OK - I figured it out - thanks.

>
> > This works fine: my($fn2) = grep ( $_ =~ '6' , glob 'f*');

>
> > What I'm confused about is the parens around the $fn2 ? Why are those
> > needed? Something tells me that has something to do with making the
> > scalar $fn2 into a list 'cause that's what grep returns, but i can't
> > remember what that's called to look it up.

>
> * * my $x = ...
>
> evaluates the RHS in scalar context, but
>
> * * my ($x) = ...
>
> evaluates it in list context. The same applies without the 'my', or with
> 'local' instead. This is one of the few cases where explicit parens make
> a difference in deciding whether something is a list or not.
>
> Ben


Nice to hear from you Ben (hope things are well).
Thanks Ben and Tad for clearing up the 'context'.
Of course, you're right Tad - the code assumes the first one it finds
is the right one. In this case that should be ok - but knowing more
about that behavior is a good thing (and might keep me from posting
some other day).

(sorry about the top post)
pg

 
Reply With Quote
 
Steve C
Guest
Posts: n/a
 
      08-10-2009
Ben Morrow wrote:
> [please don't top-post]
>
> Quoth Steve C <>:
>> - SC.
>>
>> then it asks grep for a scalar.
>> but when you call it without the parens
>> it asks grep for a list

>
> Please don't talk nonsense.
>
> Ben
>


Too subtle, I guess.
SC
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
MasonCompRoot and globs Tim Watts Perl Misc 6 07-29-2010 10:26 PM
Regex testing and UTF8 awarenes or Regex and numeric pattern matching sln@netherlands.com Perl Misc 2 03-10-2009 03:51 AM
How make regex that means "contains regex#1 but NOT regex#2" ?? seberino@spawar.navy.mil Python 3 07-01-2008 03:06 PM
globs, ref globs, and lexically scoped filehandles Alex Hart Perl Misc 1 01-24-2005 11:02 PM
globs, ref globs, and lexically scoped filehandles Alex Hart Perl Misc 0 01-24-2005 08:21 AM



Advertisments