Σελ. 1 από 2 12 ΤελευταίαΤελευταία
Εμφάνιση 1-15 από 18

Θέμα: for loop for perl

  1. #1
    Εγγραφή
    20-09-2005
    Μηνύματα
    215
    Downloads
    1
    Uploads
    0
    μετά από τα παρακάτω θέματα, έχω ακόμα ένα πρόβλημα.
    ορίζω αρχεία που βρίσκονται σε φάκελο ως:

    Κώδικας:
    #!/usr/bin/perl
    use File::Path;
    use warnings;
    use strict;
    my $path = $ENV{HOME};
    	my $desktop_path = "$path/Desktop";
    		my $PeakDir = "$desktop_path/BioProject";
    		my $RepeatDir = "$desktop_path/repeatfiles";
    	mkpath($PeakDir);
    #open peak file downloaded and saved to PeakDir folder, and read contents
    opendir (peakDir, "$PeakDir") || die "can't opendir $PeakDir: $!";
    my @peakfiles = readdir (peakDir);
    και πάω να αρχίσω να επεξεργάζομαι κάθε αρχείο ως;

    Κώδικας:
    #for (my $i=0; $i<=scalar("@peakfiles")-1;$i++);
    και τρώω ήτα. δεν το βλέπει καλά. τι λάθος κάνω; και γιατί;

  2. #2
    Εγγραφή
    20-09-2005
    Μηνύματα
    215
    Downloads
    1
    Uploads
    0
    επιπλέον βλέπω ότι εάν πάω να "εκτυπώσω" το πρώτο στοιχείο που υπάρχει στα peakfiles μου βγαίνει λάθος.
    Κώδικας:
    print "1st file in array is: $peakfiles[0]\n";
    #δε μου δίνει κάτι, μόνο τελείες.

  3. #3
    Εγγραφή
    20-09-2005
    Μηνύματα
    215
    Downloads
    1
    Uploads
    0
    κανείς;

  4. #4
    Εγγραφή
    20-12-2005
    Μηνύματα
    3.232
    Downloads
    4
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    49997/4997
    ISP
    ΟΤΕ Conn-x
    DSLAM
    ΟΤΕ - ΞΑΝΘΗ
    Router
    Speedport W 724V
    SNR / Attn
    24,4(dB) / (dB)
    Παράθεση Αρχικό μήνυμα από trotos Εμφάνιση μηνυμάτων
    και πάω να αρχίσω να επεξεργάζομαι κάθε αρχείο ως;

    Κώδικας:
    #for (my $i=0; $i<=scalar("@peakfiles")-1;$i++);
    και τρώω ήτα. δεν το βλέπει καλά. τι λάθος κάνω; και γιατί;
    Παράθεση Αρχικό μήνυμα από trotos Εμφάνιση μηνυμάτων
    επιπλέον βλέπω ότι εάν πάω να "εκτυπώσω" το πρώτο στοιχείο που υπάρχει στα peakfiles μου βγαίνει λάθος.
    Κώδικας:
    print "1st file in array is: $peakfiles[0]\n";
    #δε μου δίνει κάτι, μόνο τελείες.
    Συνδυάζοντας τα δύο παραπάνω έχουμε
    Κώδικας:
    for (my $i = 0; $i <= scalar(@peakfiles)-1; $i++) {
            print "$i file in array is: $peakfiles[$i]\n";
    }
    Δοκίμασε αυτό και δες τι σου βγάζει. Οι δύο πρώτες καταχωρήσεις είναι ο τρέχων κατάλογος και ο πατρικός κατάλογος δηλαδή . και .. οπότε αν δεν έχεις άλλα αρχεία λογικό να βλέπεις μόνο τελείες.
    "I like offending people, because I think people who get offended should be offended" - Linus Torvalds

    "Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
    κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
    Γα.... την πολιτική ορθότητα.

  5. #5
    Εγγραφή
    30-07-2008
    Περιοχή
    Ηλιούπολη, Αθήνα
    Ηλικία
    48
    Μηνύματα
    2.746
    Downloads
    3
    Uploads
    0
    Τύπος
    ADSL2+
    Ταχύτητα
    8192/384
    ISP
    TEE
    DSLAM
    ΟΤΕ - ΔΑΦΝΗΣ
    Router
    Cisco 886w
    SNR / Attn
    5(dB) / 46(dB)
    Μην γράφετε perl με ανάπηρο τρόπο

    Δοκίμασε αυτό να δεις την λίστα των αρχείων σου. Απλά πράγματα:

    Κώδικας:
    foreach my $file (@peakfiles) {
      print "$file\n";
    }
    Δε βλέπω κάποιο πρόβλημα στον κώδικά σου. Θα βοηθούσε αφάνταστα να μας πεις πιο ακριβώς είναι το πρόβλημά σου.

  6. #6
    Εγγραφή
    28-02-2006
    Μηνύματα
    1.162
    Downloads
    0
    Uploads
    0
    ISP
    Cosmote
    DSLAM
    ΟΤΕ - ΓΑΛΑΤΣΙ
    Παράθεση Αρχικό μήνυμα από boeotian Εμφάνιση μηνυμάτων
    Μην γράφετε perl με ανάπηρο τρόπο
    Χαχαχα, θεός!!!

    Πέρα από την πλάκα όμως, πράγματι το for της perl χρησιμοποιείται όταν θέλεις να κάνεις κάτι πιο εξειδικευμένο με τους indexes. Πιο συχνό και πιο συνηθισμένο για πράγματα που γίνονται σε κάθε μέλος ενός array, είναι το foreach, όπως πολύ σωστά είπε ο boeotian.
    NetBSD Rocks!
    http://www.netbsd.org

  7. #7
    Εγγραφή
    30-07-2008
    Περιοχή
    Ηλιούπολη, Αθήνα
    Ηλικία
    48
    Μηνύματα
    2.746
    Downloads
    3
    Uploads
    0
    Τύπος
    ADSL2+
    Ταχύτητα
    8192/384
    ISP
    TEE
    DSLAM
    ΟΤΕ - ΔΑΦΝΗΣ
    Router
    Cisco 886w
    SNR / Attn
    5(dB) / 46(dB)
    Πράγματι, μόνο αν σε ενδιαφέρει η θέση των στοιχείων μέσα στο array θα μπορούσες να χρησιμοποιούσες ποτέ το for loop, αν και αυτό λύνεται εύκολα και με counter $i++ κάπου

    Επίσης χρησιμοποίησε και αυτό:

    Κώδικας:
    use Data::Dumper;
    print Dumper($myscalar, $myref, \@myarray, \%myhash);
    Δεν πας πουθενά χωρίς Data:umper. Είναι το ευαγγέλιο σου για να δεις τι έχει μέσα η κάθε δομή με ωραία παρουσίαση.

  8. #8
    Εγγραφή
    20-09-2005
    Μηνύματα
    215
    Downloads
    1
    Uploads
    0
    ευχαριστώ για τις απαντήσεις το απόγευμα που θα έχω χρόνο θα δοκιμάσω.
    @boetian
    Μην γράφετε perl με ανάπηρο τρόπο
    συγνώμη αλλά δεν είμαι και ο θεός του προγραμματισμού. τώρα μαθαίνω και προσπαθώ να μάθω από κάτι που χρειάζεται να γίνει.

  9. #9
    Εγγραφή
    20-09-2005
    Μηνύματα
    215
    Downloads
    1
    Uploads
    0
    Παράθεση Αρχικό μήνυμα από boeotian Εμφάνιση μηνυμάτων
    Πράγματι, μόνο αν σε ενδιαφέρει η θέση των στοιχείων μέσα στο array θα μπορούσες να χρησιμοποιούσες ποτέ το for loop, αν και αυτό λύνεται εύκολα και με counter $i++ κάπου

    Επίσης χρησιμοποίησε και αυτό:

    Κώδικας:
    use Data::Dumper;
    print Dumper($myscalar, $myref, \@myarray, \%myhash);
    Δεν πας πουθενά χωρίς Data:umper. Είναι το ευαγγέλιο σου για να δεις τι έχει μέσα η κάθε δομή με ωραία παρουσίαση.
    το for loop με ενδιαφέρει γιατί στο επόμενο βήμα θα χρησιμοποιήσω ένα ένα τα στοιχεία, όπως παίρνουν θέση από την καταμέτρηση i για να γίνεται επεξεργασία σε κάθε ένα.

    Όλα αυτά που δίνεται στην παρούσα ενότητα πάντως με βοηθάνε να μάθω να γράφω στην perl.

    ........Auto merged post: trotos πρόσθεσε 58 λεπτά και 40 δευτερόλεπτα αργότερα ........

    Παράθεση Αρχικό μήνυμα από imitheos Εμφάνιση μηνυμάτων
    Συνδυάζοντας τα δύο παραπάνω έχουμε
    Κώδικας:
    for (my $i = 0; $i <= scalar(@peakfiles)-1; $i++) {
            print "$i file in array is: $peakfiles[$i]\n";
    }
    Δοκίμασε αυτό και δες τι σου βγάζει. Οι δύο πρώτες καταχωρήσεις είναι ο τρέχων κατάλογος και ο πατρικός κατάλογος δηλαδή . και .. οπότε αν δεν έχεις άλλα αρχεία λογικό να βλέπεις μόνο τελείες.
    το έκανα δούλεψε αλλά είδα ότι έχουν πάρει και καταχωρήσεις τα . και .. όπως φαίνονται στις πρώτες γραμμές:
    Κώδικας:
    0 file in array is: .
    1 file in array is: ..
    2 file in array is: wgEncodeBroadChipSeqPeaksGm12878Ctcf.broadPeak.gz
    3 file in array is: wgEncodeBroadChipSeqPeaksGm12878H3k27ac.broadPeak.gz
    4 file in array is: wgEncodeBroadChipSeqPeaksGm12878H3k27me3.broadPeak.gz
    5 file in array is: wgEncodeBroadChipSeqPeaksGm12878H3k36me3.broadPeak.gz
    6 file in array is: wgEncodeBroadChipSeqPeaksGm12878H3k4me1.broadPeak.gz
    7 file in array is: wgEncodeBroadChipSeqPeaksGm12878H3k4me2.broadPeak.gz
    8 file in array is: wgEncodeBroadChipSeqPeaksGm12878H3k4me3.broadPeak.gz
    9 file in array is: wgEncodeBroadChipSeqPeaksGm12878H3k9ac.broadPeak.gz
    10 file in array is: wgEncodeBroadChipSeqPeaksGm12878H4k20me1.broadPeak.gz
    11 file in array is: wgEncodeBroadChipSeqPeaksH1hescCtcf.broadPeak.gz
    12 file in array is: wgEncodeBroadChipSeqPeaksH1hescH3k27me3.broadPeak.gz
    13 file in array is: wgEncodeBroadChipSeqPeaksH1hescH3k36me3.broadPeak.gz
    14 file in array is: wgEncodeBroadChipSeqPeaksH1hescH3k4me1.broadPeak.gz
    15 file in array is: wgEncodeBroadChipSeqPeaksH1hescH3k4me2.broadPeak.gz
    16 file in array is: wgEncodeBroadChipSeqPeaksH1hescH3k4me3.broadPeak.gz
    17 file in array is: wgEncodeBroadChipSeqPeaksH1hescH3k9ac.broadPeak.gz
    18 file in array is: wgEncodeBroadChipSeqPeaksH1hescH4k20me1.broadPeak.gz
    Τελευταία επεξεργασία από το μέλος trotos : 17-01-12 στις 23:27. Αιτία: auto merged post

  10. #10
    Εγγραφή
    20-12-2005
    Μηνύματα
    3.232
    Downloads
    4
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    49997/4997
    ISP
    ΟΤΕ Conn-x
    DSLAM
    ΟΤΕ - ΞΑΝΘΗ
    Router
    Speedport W 724V
    SNR / Attn
    24,4(dB) / (dB)
    Παράθεση Αρχικό μήνυμα από trotos Εμφάνιση μηνυμάτων
    το έκανα δούλεψε αλλά είδα ότι έχουν πάρει και καταχωρήσεις τα . και .. όπως φαίνονται στις πρώτες γραμμές:
    Κώδικας:
    0 file in array is: .
    1 file in array is: ..
    2 file in array is: wgEncodeBroadChipSeqPeaksGm12878Ctcf.broadPeak.gz
    3 file in array is: wgEncodeBroadChipSeqPeaksGm12878H3k27ac.broadPeak.gz
    Εφόσον υπάρχουν φυσικά θα τα έχει και αυτά. Αν θες να μην υπάρχουν μπορείς να τα αφαιρέσεις. Ένας τρόπος που μου ήρθε στο μυαλό (χωρίς όμως να ξέρω αν είναι δόκιμος ή ανάπηρος) είναι ο εξής:

    Κώδικας:
    my @peakfiles = grep { ! /^\.{1,2}$/ } readdir (peakDir);
    Δηλαδή αφαιρεί τα αποτελέσματα που έχουν μόνο 1 ή 2 τελείες.
    "I like offending people, because I think people who get offended should be offended" - Linus Torvalds

    "Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
    κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
    Γα.... την πολιτική ορθότητα.

  11. #11
    Εγγραφή
    20-09-2005
    Μηνύματα
    215
    Downloads
    1
    Uploads
    0
    ανεξάρτητα από το παραπάνω (την ύπαρξη των αρχείων "." και ".." προχώρησα λίγο την δουλειά ως:

    Κώδικας:
    for (my $i = 0; $i <= scalar(@peakfiles)-1; $i++) {
            print "$i file in array is: $peakfiles[$i]\n";
    		for (my $j=0; $j<=scalar(@repeatfiles)-1;$j++) {
    		print "$j file in array is: $repeatfiles[$j]\n";
    		}
    το αποτέλεσμα είναι αυτό.
    Κώδικας:
    έχει και άλλα πίσω
    .
    .
    .
    0 file in array is: .
    1 file in array is: ..
    2 file in array is: Class.bed
    3 file in array is: Family.bed
    4 file in array is: Name.bed
    17 file in array is: wgEncodeBroadChipSeqPeaksH1hescH3k9ac.broadPeak.gz
    0 file in array is: .
    1 file in array is: ..
    2 file in array is: Class.bed
    3 file in array is: Family.bed
    4 file in array is: Name.bed
    18 file in array is: wgEncodeBroadChipSeqPeaksH1hescH4k20me1.broadPeak.gz
    0 file in array is: .
    1 file in array is: ..
    2 file in array is: Class.bed
    3 file in array is: Family.bed
    4 file in array is: Name.bed
    πάλι τα . και .. είναι ανεπιθύμητα αλλά η σειρά με την οποία αυτά εξάγονται είναι καλή γιατί έτσι μπορώ να συγκρίνω το πχ 18 με τα 2,3,4.

    όταν μετά καλώ ένα πρόγραμμα από το σύστημα ως:
    Κώδικας:
    system ("intersectBed", "-a", "$repeatfiles[j]", "-b", "$bedfilename[i]")
    παίρνω το εξής λάθος:

    Κώδικας:
    String found where operator expected at /Users/sunta3iouxos/Desktop/bioinfo/myscript.pl line 149, near ""intersectBed" "-a""
    	(Missing operator before  "-a"?)
    String found where operator expected at /Users/sunta3iouxos/Desktop/bioinfo/myscript.pl line 149, near ""-a" "$repeatfiles""
    	(Missing operator before  "$repeatfiles"?)
    String found where operator expected at /Users/sunta3iouxos/Desktop/bioinfo/myscript.pl line 149, near ""-b" "$bedfilename""
    	(Missing operator before  "$bedfilename"?)

  12. #12
    Εγγραφή
    20-09-2005
    Μηνύματα
    215
    Downloads
    1
    Uploads
    0
    Παράθεση Αρχικό μήνυμα από imitheos Εμφάνιση μηνυμάτων
    Εφόσον υπάρχουν φυσικά θα τα έχει και αυτά. Αν θες να μην υπάρχουν μπορείς να τα αφαιρέσεις. Ένας τρόπος που μου ήρθε στο μυαλό (χωρίς όμως να ξέρω αν είναι δόκιμος ή ανάπηρος) είναι ο εξής:

    Κώδικας:
    my @peakfiles = grep { ! /^\.{1,2}$/ } readdir (peakDir);
    Δηλαδή αφαιρεί τα αποτελέσματα που έχουν μόνο 1 ή 2 τελείες.
    δε νομίζω να μου κάνει γιατί υπάρχει και η τελεία της κατάληξης των αρχείων. εκτός και αν βρίσκει μόνο τελείες.
    κάποιος λάκκος υπάρχει με το file structure αλλά δεν έχω καμία ιδέα.

  13. #13
    Εγγραφή
    30-07-2008
    Περιοχή
    Ηλιούπολη, Αθήνα
    Ηλικία
    48
    Μηνύματα
    2.746
    Downloads
    3
    Uploads
    0
    Τύπος
    ADSL2+
    Ταχύτητα
    8192/384
    ISP
    TEE
    DSLAM
    ΟΤΕ - ΔΑΦΝΗΣ
    Router
    Cisco 886w
    SNR / Attn
    5(dB) / 46(dB)
    Παράθεση Αρχικό μήνυμα από trotos Εμφάνιση μηνυμάτων
    ε
    @boetian

    συγνώμη αλλά δεν είμαι και ο θεός του προγραμματισμού. τώρα μαθαίνω και προσπαθώ να μάθω από κάτι που χρειάζεται να γίνει.
    Συγνώμη αν σε πρόσβαλλα, αλλά ο σκοπός μου ήταν ακριβώς να επιστήσω την προσοχή στο να γράφουμε perl way.

    Παράθεση Αρχικό μήνυμα από trotos Εμφάνιση μηνυμάτων
    ανεξάρτητα από το παραπάνω (την ύπαρξη των αρχείων "." και ".." προχώρησα λίγο την δουλειά ως:

    Κώδικας:
    for (my $i = 0; $i <= scalar(@peakfiles)-1; $i++) {
            print "$i file in array is: $peakfiles[$i]\n";
    		for (my $j=0; $j<=scalar(@repeatfiles)-1;$j++) {
    		print "$j file in array is: $repeatfiles[$j]\n";
    		}
    το αποτέλεσμα είναι αυτό.
    Εγώ πάντως θα προτιμούσα ένα for:

    Κώδικας:
    for (my $i = 0; $i < scalar(@peakfiles); $i++) {
    ή

    Κώδικας:
    for my $i (0..scalar(@peakfiles)-1) {
    Παράθεση Αρχικό μήνυμα από trotos Εμφάνιση μηνυμάτων
    όταν μετά καλώ ένα πρόγραμμα από το σύστημα ως:
    Κώδικας:
    system ("intersectBed", "-a", "$repeatfiles[j]", "-b", "$bedfilename[i]")
    παίρνω το εξής λάθος:

    Κώδικας:
    String found where operator expected at /Users/sunta3iouxos/Desktop/bioinfo/myscript.pl line 149, near ""intersectBed" "-a""
    	(Missing operator before  "-a"?)
    String found where operator expected at /Users/sunta3iouxos/Desktop/bioinfo/myscript.pl line 149, near ""-a" "$repeatfiles""
    	(Missing operator before  "$repeatfiles"?)
    String found where operator expected at /Users/sunta3iouxos/Desktop/bioinfo/myscript.pl line 149, near ""-b" "$bedfilename""
    	(Missing operator before  "$bedfilename"?)
    Δοκίμασε να σώσεις το αρχείο πριν το τρέξεις, γιατί το μήνυμα λάθους που έβαλες δεν έχει καμία σχέση με το system. Το μήνυμα λάθους λέει ότι έτρεξες το system ως εξής:

    Κώδικας:
    system ("intersectBed" "-a" "$repeatfiles[j]" "-b" "$bedfilename[i]")
    χωρίς κόμμα.

    Παράθεση Αρχικό μήνυμα από trotos Εμφάνιση μηνυμάτων
    δε νομίζω να μου κάνει γιατί υπάρχει και η τελεία της κατάληξης των αρχείων. εκτός και αν βρίσκει μόνο τελείες.
    κάποιος λάκκος υπάρχει με το file structure αλλά δεν έχω καμία ιδέα.
    Αυτό που έδωσε ο imitheos αφαιρεί ακριβώς την τελεία και την διπλή τελεία. Έχεις τους operators για αρχή και τέλος, άρα είναι safe matching.

  14. #14
    Εγγραφή
    20-09-2005
    Μηνύματα
    215
    Downloads
    1
    Uploads
    0
    Παράθεση Αρχικό μήνυμα από boeotian Εμφάνιση μηνυμάτων
    Συγνώμη αν σε πρόσβαλλα, αλλά ο σκοπός μου ήταν ακριβώς να επιστήσω την προσοχή στο να γράφουμε perl way.



    Εγώ πάντως θα προτιμούσα ένα for:

    Κώδικας:
    for (my $i = 0; $i < scalar(@peakfiles); $i++) {
    ή

    Κώδικας:
    for my $i (0..scalar(@peakfiles)-1) {


    Δοκίμασε να σώσεις το αρχείο πριν το τρέξεις, γιατί το μήνυμα λάθους που έβαλες δεν έχει καμία σχέση με το system. Το μήνυμα λάθους λέει ότι έτρεξες το system ως εξής:

    Κώδικας:
    system ("intersectBed" "-a" "$repeatfiles[j]" "-b" "$bedfilename[i]")
    χωρίς κόμμα.



    Αυτό που έδωσε ο imitheos αφαιρεί ακριβώς την τελεία και την διπλή τελεία. Έχεις τους operators για αρχή και τέλος, άρα είναι safe matching.
    τσεκάρω το βράδυ και επανέρχομαι

  15. #15
    Εγγραφή
    28-02-2006
    Μηνύματα
    1.162
    Downloads
    0
    Uploads
    0
    ISP
    Cosmote
    DSLAM
    ΟΤΕ - ΓΑΛΑΤΣΙ
    Πάντως ο συνήθης perl τρόπος (και όχι ανάπηρος ) για να παίρνεις τα αρχεία μέσα σε ένα directory είναι με το λεγόμενο globbing, δηλαδή:

    Κώδικας:
    my @files = <*>;
    foreach my $file (@files) {
      print $file . "\n";
    }
    Μπορείς μέσα στο loop με διάφορους τελεστές της perl, να δεις τι είναι αυτά τα πραγματάκια που υπάρχουν μέσα στον κατάλογο, π.χ. :

    Κώδικας:
    my @files = <*>;
    foreach my $file (@files) {
     if (-f $file) {
      print "This is a file: " . $file  . "\n";
     }
     if (-d $file) {
      print "This is a directory: " . $file  . "\n";
     }
    }
    NetBSD Rocks!
    http://www.netbsd.org

Σελ. 1 από 2 12 ΤελευταίαΤελευταία

Bookmarks

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας