Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Perl Misc (http://www.velocityreviews.com/forums/f67-perl-misc.html)
-   -   using file globs and regex (http://www.velocityreviews.com/forums/t911182-using-file-globs-and-regex.html)

pgodfrin 08-07-2009 04:33 PM

using file globs and regex
 
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

pgodfrin 08-07-2009 05:23 PM

Re: using file globs and regex
 
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/"



pgodfrin 08-07-2009 06:23 PM

Re: using file globs and regex
 
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/"

>
>



pgodfrin 08-07-2009 07:21 PM

Re: using file globs and regex
 
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/"

>
>



Steve C 08-07-2009 09:00 PM

Re: using file globs and regex
 
- 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/"

>>

>


Xho Jingleheimerschmidt 08-08-2009 02:25 AM

Re: using file globs and regex
 
Tad J McClellan wrote:
> pgodfrin <pgodfrin@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*');


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



pgodfrin 08-10-2009 06:20 PM

Re: using file globs and regex
 
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


Steve C 08-10-2009 06:39 PM

Re: using file globs and regex
 
Ben Morrow wrote:
> [please don't top-post]
>
> Quoth Steve C <smallpond@juno.com>:
>> - 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


All times are GMT. The time now is 11:30 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.