need a perl replacement for this double for loop


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting need a perl replacement for this double for loop
# 1  
Old 04-01-2010
[solved] need a perl replacement for this double for loop

hi everybody,
can you help me with this?
important: it has to be a pure perl code.

zz.lis:
Code:
accessibility
arabic
archivers
astro
audio
benchmarks
.
.
.

"ls accessibility | grep -v Makefile" outputs
Code:
accerciser
at-poke
at-spi
at-spi-reference
atk
atk-reference
dasher
eflite
gail
.
.
.

this double foor loop works excellent, but i need a perl solution:
Code:
$ for i in `cat zz.lis`
do
for ii in `ls $i | grep -v Makefile`
do
echo $i/$ii >> zzzz.lis
done
done

zzzz.lis:
Code:
accessibility/accerciser
accessibility/at-poke
accessibility/at-spi
accessibility/at-spi-reference
accessibility/atk
accessibility/atk-reference
accessibility/dasher
accessibility/eflite
accessibility/gail
.
.
.
.


Last edited by pseudocoder; 04-01-2010 at 10:18 PM.. Reason: added solved in the subject
# 2  
Old 04-01-2010
Quote:
Originally Posted by pseudocoder
...
"ls accessibility | grep -v Makefile" outputs
Code:
accerciser
at-poke
at-spi
at-spi-reference
atk
atk-reference
dasher
eflite
gail
.
.
.

...
Hmm.. that doesn't work for me:

Code:
$
$ ls *
accessibility  arabic  zz.lis
$
$ ls accessibility | grep -v Makefile
accessibility
$
$ ls arabic | grep -v Makefile
arabic
$

It simply prints the file name back.

tyler_durden
# 3  
Old 04-01-2010
hi tyler_durden,
okay it seems my problem description was a bit unclear.
file zz.lis contains a list of directory names, so no wonder you don't have them on your system.
in fact that are pieces of the freebsd ports collection.
to build this environment, you would have to:

Code:
$ mkdir test
$ cd test
$ mkdir accessibility
$ touch accessibility/Makefile
$ touch accessibility/accerciser
$ touch accessibility/at-poke
$ touch accessibility/at-spi
$ mkdir arabic
$ touch arabic/Makefile
$ touch arabic/ae_fonts_mono
$ touch arabic/ae_fonts_ttf
$ touch arabic/
$ touch zz.lis
$ echo accessibility >> zz.lis
$ echo arabic >> zz.lis

# 4  
Old 04-01-2010
Quote:
Originally Posted by pseudocoder
...
file zz.lis contains a list of directory names, so no wonder you don't have them on your system.
in fact that are pieces of the freebsd ports collection.
to build this environment, you would have to:

Code:
$ mkdir test
$ cd test
$ mkdir accessibility
$ touch accessibility/Makefile
$ touch accessibility/accerciser
$ touch accessibility/at-poke
$ touch accessibility/at-spi
$ mkdir arabic
$ touch arabic/Makefile
$ touch arabic/ae_fonts_mono
$ touch arabic/ae_fonts_ttf
$ touch arabic/
$ touch zz.lis
$ echo accessibility >> zz.lis
$ echo arabic >> zz.lis


Thanks for clearing that up.
So after executing all those commands, I have this in the directory "test" -

Code:
$ 
$ ls -1
accessibility
arabic
zz.lis
$ 
$ find . -name "*"
.
./zz.lis
./accessibility
./accessibility/accerciser
./accessibility/at-spi
./accessibility/Makefile
./accessibility/at-poke
./arabic
./arabic/ae_fonts_ttf
./arabic/Makefile
./arabic/ae_fonts_mono
$ 
$ 
$ cat -n zz.lis
     1  accessibility
     2  arabic
$ 
$

And here's a Perl equivalent of the shell script you posted earlier:

Code:
$ 
$ 
$ perl -lne 'foreach (glob "$_/*"){print if !/Makefile$/}' zz.lis
accessibility/accerciser
accessibility/at-poke
accessibility/at-spi
arabic/ae_fonts_mono
arabic/ae_fonts_ttf
$ 
$

tyler_durden
# 5  
Old 04-01-2010
Quote:
Originally Posted by durden_tyler
$ perl -lne 'foreach (glob "$_/*"){print if !/Makefile$/}' zz.lis[/code]
nice one-liner. worked fairly good!
after processing 22067 items it even helped me to find a bug in my previous result which the 2 for loops have produced (there are 2 directories, which have Makefile in their name, and i need them to be included in the output)

this is the difference:
Code:
arabic/Makefile.inc
chinese/Makefile.inc
french/Makefile.inc
german/Makefile.inc
hebrew/Makefile.inc
hungarian/Makefile.inc
japanese/Makefile.inc
korean/Makefile.inc
polish/Makefile.inc
portuguese/Makefile.inc
russian/Makefile.inc
textproc/p5-Makefile-DOM
textproc/p5-Makefile-Parser
ukrainian/Makefile.inc
vietnamese/Makefile.inc

if you could adjust your one-liner to skip Makefile.inc too, that would be just PERFECT.

thank you so far.
# 6  
Old 04-01-2010
Quote:
Originally Posted by pseudocoder
...
Code:
arabic/Makefile.inc
chinese/Makefile.inc
french/Makefile.inc
german/Makefile.inc
hebrew/Makefile.inc
hungarian/Makefile.inc
japanese/Makefile.inc
korean/Makefile.inc
polish/Makefile.inc
portuguese/Makefile.inc
russian/Makefile.inc
textproc/p5-Makefile-DOM
textproc/p5-Makefile-Parser
ukrainian/Makefile.inc
vietnamese/Makefile.inc

if you could adjust your one-liner to skip Makefile.inc too, that would be just PERFECT.

...
I don't think I understood your post completely, but here's what I did.
I touch'd the files "Makefile.inc", "p5-Makefile-DOM", "p5-Makefile-Parser" and "p6-Makefile-SAX" so that my find command shows the following -

Code:
$ 
$ find . -name "*"
.
./zz.lis
./accessibility
./accessibility/accerciser
./accessibility/at-spi
./accessibility/Makefile
./accessibility/at-poke
./accessibility/p5-Makefile-Parser
./accessibility/p5-Makefile-DOM
./accessibility/Makefile.inc
./arabic
./arabic/ae_fonts_ttf
./arabic/p6-Makefile-SAX
./arabic/Makefile
./arabic/p5-Makefile-Parser
./arabic/p5-Makefile-DOM
./arabic/ae_fonts_mono
./arabic/Makefile.inc
$ 
$

Now, my previous script would return each file path except the ones that end with "Makefile".
This means that the files "Makefile.inc", "p5-Makefile-DOM", "p5-Makefile-Parser" and "p6-Makefile-SAX" will be present in the output -

Code:
$ 
$ perl -lne 'foreach (glob "$_/*"){print if !/Makefile$/}' zz.lis
accessibility/accerciser
accessibility/at-poke
accessibility/at-spi
accessibility/Makefile.inc
accessibility/p5-Makefile-DOM
accessibility/p5-Makefile-Parser
arabic/ae_fonts_mono
arabic/ae_fonts_ttf
arabic/Makefile.inc
arabic/p5-Makefile-DOM
arabic/p5-Makefile-Parser
arabic/p6-Makefile-SAX
$

The following script skips "Makefile" as well as "Makefile.inc".
But it will still show the other three: "p5-Makefile-DOM", "p5-Makefile-Parser" and "p6-Makefile-SAX" -

Code:
$ 
$ perl -lne 'foreach (glob "$_/*"){print if !/Makefile[.inc]*$/}' zz.lis
accessibility/accerciser
accessibility/at-poke
accessibility/at-spi
accessibility/p5-Makefile-DOM
accessibility/p5-Makefile-Parser
arabic/ae_fonts_mono
arabic/ae_fonts_ttf
arabic/p5-Makefile-DOM
arabic/p5-Makefile-Parser
arabic/p6-Makefile-SAX
$ 
$

Now, I see "p5-Makefile-DOM" and "p5-Makefile-Parser" in the list in your post. But you did not mention anything about them.
Did you want them skipped as well ? Is yes, then -

Code:
$ 
$ 
$ perl -lne 'foreach (glob "$_/*"){print if !/Makefile([.inc]|-(DOM|Parser))*$/}' zz.lis
accessibility/accerciser
accessibility/at-poke
accessibility/at-spi
arabic/ae_fonts_mono
arabic/ae_fonts_ttf
arabic/p6-Makefile-SAX
$ 
$

Note that the regular expression is very restrictive and will exclude only the file paths that either end with "Makefile", or "Makefile.inc", or "Makefile-DOM" or "Makefile-Parser".
Which means the file path ending with "Makefile-SAX" will be included in the output (and you can see that above).
You can, of course, tweak the regular expression further on to remove different types of "Makefile" files.

However, if your actual problem statement is - "Skip all files that have the characters Makefile anywhere in them", then the regular expression could be much simpler -

Code:
$ 
$ 
$ perl -lne 'foreach (glob "$_/*"){print if !/Makefile/}' zz.lis
accessibility/accerciser
accessibility/at-poke
accessibility/at-spi
arabic/ae_fonts_mono
arabic/ae_fonts_ttf
$ 
$

HTH,
tyler_durden
# 7  
Old 04-01-2010
Quote:
Originally Posted by durden_tyler
Code:
$ perl -lne 'foreach (glob "$_/*"){print if !/Makefile[.inc]*$/}' zz.lis

this one fully meets my requirement. thank you very very much.

p5-Makefile-DOM, p5-Makefile-Parser are subdirectories, which exist in the textproc directory only.

Quote:
Originally Posted by durden_tyler
Now, I see "p5-Makefile-DOM" and "p5-Makefile-Parser" in the list in your post. But you did not mention anything about them.
Did you want them skipped as well ?
i've mentioned them when i was speaking about the bug. no, they should not be skipped.

anyway, thank you for your several explanations, they will help me to better understand the syntax.
btw. sorry about my bad expression, it's bcs. english is not my native language, but after all we've worked it out :-)
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Perl:: mass replacement of converting C code formats to tgmath.h

hello, i have a lot of C old code I'm updating to C11 with tgmath.h for generic math. the old code has very specific types, real and complex, like cabsl, csinhl, etc usually for simple bulk replacements i would do something simple like this perl -pi -e 's/cosl/cos/g' *.c the reference... (0 Replies)
Discussion started by: f77hack
0 Replies

2. Shell Programming and Scripting

Perl String Replacement Syntax Question . . .

Greetings! I've been tooling about with Perl to make a few string replacements in some files; and seem to have run into a bit of a squeeze :) Beginning with a simple text file, test.txt, we have the following content to be worked:Now, not wanting to have anyone feel left out, I decided that... (6 Replies)
Discussion started by: LinQ
6 Replies

3. Shell Programming and Scripting

Word replacement in Perl

I have the following string : Cat dog fox catepillar bear foxy I need to replace "cat" and "fox" words from this sentence to word "animal" I do the following: $Str1="cat"; $Str2="fox"; $NewStr="animal"; open(F1, "<$inputFile") or die "Error: $!"; open(F2, ">$outputFile") or... (1 Reply)
Discussion started by: AIX_30
1 Replies

4. Shell Programming and Scripting

Perl Array Elements Replacement

Hello, I have the following perl array: @longname = (Fasthernet0/0 Fasthernet0/1 Serial0/1/0 Serial0/2/1 Tunnel55 Tunnel77) with the followinh array: @shortname = (Fa0/0 Fa0/1 Se0/1/0 Se0/2/1 Tu55 Tu77) in other words, I need to remove the following from each element in the array... (4 Replies)
Discussion started by: ahmed_zaher
4 Replies

5. Shell Programming and Scripting

HELP Need in SED/PERL conditional line replacement

Hi , I need some help on perl/sed conditional replacement The situation is like below . I have a file contents like below . AAA|BBB|CCC|DDD AAA|BCF|CCC|HHH AAA|BVF|JJJ|KKK Here in the above file . I know my second column value (taking "|" as my delimited ) Basically I have to... (3 Replies)
Discussion started by: robin.r888
3 Replies

6. Shell Programming and Scripting

Replacement of sentence in perl

Hi, I have 3 arrays: @arr1=("Furthermore, apigenin treatment increased the level of association of the RNA binding protein HuR with endogenous p53 mRNA","one of the mechanisms by which apigenin induces p53 protein expression is enhancement of translation through the RNA binding protein... (1 Reply)
Discussion started by: vanitham
1 Replies

7. Shell Programming and Scripting

perl as awk replacement in a script.

Hey all, Im trying to write a script on windows, which Im not too familiar with. Im generally a bash scripting guy but am using perl for this case. My question is... I have this exact output: 2 Dir(s) 6,380,429,312 bytes free and I just need to get the number out... (4 Replies)
Discussion started by: trey85stang
4 Replies

8. Shell Programming and Scripting

Replacement for eval in Perl??????

I used the eval command in shell programming for assigning a value to a stored value of a variable. Example: VAR="Unix_Id" eval $VAR="101" eval echo $"$VAR" How can i assign a value to a stored value of a variable in perl OR how i can write above code in Perl? I need your help... (4 Replies)
Discussion started by: kunal_dixit
4 Replies

9. Shell Programming and Scripting

Replacement of sed with perl

Hi using the below cmd i am identifying wheether last character in each line in thousands of files as semicolon or not.If last character is semicolon i am removing semicolon .If last character is not semicolon then i am appending next line to present line . For example my input file consists of... (4 Replies)
Discussion started by: dbsurf
4 Replies

10. Shell Programming and Scripting

String Replacement with Perl

I want to replace a string within a file using perl. We have a line that gets commented out, and I want to replace that line now matter how it was commented out. for example, I'd want to replace ###ES=PR1A with ES=PR1A or ##LJW(9/16/26)ES=PR1A with ES=PR1A I tried: perl... (4 Replies)
Discussion started by: Lindarella
4 Replies
Login or Register to Ask a Question