Luciddream Δημοσ. 5 Ιουλίου 2016 Δημοσ. 5 Ιουλίου 2016 Έχω μια ιδιαίτερη κατάσταση στην οποία προσπαθώ να βρώ εύκολη λύση και δεν μου έρχεται κάτι. Γράφω scriptakia σε μια κάπως ιδιαίτερη γλώσσα, στην οποία μπορεί να έχω ένα μεγάλο αρχείο με 5000 γραμμές π.χ, μέσα στο οποίο να υπάρχουν 200 διαφορετικά block εντολών. Αυτές οι εντολές είναι διαχωρισμένες με ένα standard comment π.χ Block Α1, Α2, Α3 κτλπ, και όλες οι εντολές βρίσκονται μέσα σε try catch. Για παράδειγμα //Block A1 try { entoli1 entoli2 entoli3 apotelesma } catch { error ktlp } //Block A2 try { entoli1 entoli2 entoli3 apotelesma } catch { error ktlp } return A1,A2 Θέλω να μπορώ να τρέξω κάθε block εντολής ξεχωριστά, για να βλέπω αν τρέχει ή αν σκάει, και να μπορώ να δω πόση ώρα κάνει για να τρέξει. Αν και η γλώσσα υποστηρίζει import αρχείων και θα μπορούσα να βάλω το κάθε block σε δικό του αρχείο, για διάφορους λόγους δεν βολεύει πάντα. Οπότε αποφάσισα να κρατήσω το μεγάλο αρχείο, να συνεχίσω να γράφω τα πάντα μαζί, αλλά να βρώ ένα τρόπο να "σπάω" αυτοματοποιημένα τα block σε αρχεία text και να τα τρέχω μόνα τους. Λογικά αυτό θα γίνεται με εργαλεία τύπου sed αλλά δεν έχω και πολύ εμπειρία, και ήλπιζα να υπάρχει κάτι με GUI ή κάτι που μου διαφεύγει τώρα. Οποιαδήποτε βοήθεια / ιδέα ευπρόσδεκτη.
defacer Δημοσ. 5 Ιουλίου 2016 Δημοσ. 5 Ιουλίου 2016 Ε αν είναι έτσι εύκολα τα πράγματα με στάνταρ comment format που δεν εμφανίζεται στο ξεκάρφωτο μιλάμε για λίγα λεπτά υπόθεση με κλασικά tools για να σου λένε αν ένα μπλοκ υπάρχει, να σου βγάζουν τα περιεχόμενα στη standard out οπότε μετά κάντα ο,τι θες, κλπ. Ορίστε μια ιδέα: <?php $block = 'A1'; $regexTemplate = '~^(?://Block %s)$.*?(?=^//Block)~msu'; $regex = sprintf($regexTemplate, $block); if (preg_match($regex, get_contents(), $matches)) { echo "Found:\n\n"; echo $matches[0]; } else { echo "Block $block not found\n"; } function get_contents() { return <<<END //Block A1 try { entoli1 entoli2 entoli3 apotelesma } catch { error ktlp } //Block A2 try { entoli1 entoli2 entoli3 apotelesma } catch { error ktlp } return A1,A2 END; } 2
pmav99 Δημοσ. 5 Ιουλίου 2016 Δημοσ. 5 Ιουλίου 2016 Κατ' ουσίαν το ίδιο με αυτό που προτείνει ο defacer· κάνε generate τα ξεχωριστά modules στο runtime #!/usr/bin/env python MODULE_TEXT = """ //Block A1 try { entoli1 entoli2 entoli3 apotelesma } catch { error ktlp } //Block A2 try { entoli1 entoli2 entoli3 apotelesma } catch { error ktlp } """ TEMPLATE = """ // start of generated file import foo import goo CONSTANT1 = 123 PI = 3.14 {code} // end of generated file """ blocks = [block.strip() for block in MODULE_TEXT.split("//Block") if block.strip()] for n, block in enumerate(blocks): code = "\n".join(block.splitlines()[1:]) print(TEMPLATE.format(code=code)) 2
Luciddream Δημοσ. 5 Ιουλίου 2016 Μέλος Δημοσ. 5 Ιουλίου 2016 Cool, με λίγο πείραγμα παίξαν και τα δύο... αν και το πρώτο regex κάνει match όλα χωρις το τελευταίο block αλλά πολύ μικρο το κακό Mάλλον με python θα γίνει γιατί βολεύει
groot Δημοσ. 10 Ιουλίου 2016 Δημοσ. 10 Ιουλίου 2016 Κατ' ουσίαν το ίδιο με αυτό που προτείνει ο defacer· κάνε generate τα ξεχωριστά modules στο runtime #!/usr/bin/env python MODULE_TEXT = """ //Block A1 try { entoli1 entoli2 entoli3 apotelesma } catch { error ktlp } //Block A2 try { entoli1 entoli2 entoli3 apotelesma } catch { error ktlp } """ TEMPLATE = """ // start of generated file import foo import goo CONSTANT1 = 123 PI = 3.14 {code} // end of generated file """ blocks = [block.strip() for block in MODULE_TEXT.split("//Block") if block.strip()] for n, block in enumerate(blocks): code = "\n".join(block.splitlines()[1:]) print(TEMPLATE.format(code=code)) Η, πιο ωραία, from __future__ import print_function [ print(TEMPLATE.format(code="\n".join(block_i.splitlines()[1:]))) for n, block_i in enumerate ( [ block.strip() for block in MODULE_TEXT.split("//Block") if block.strip() ] ) ]
pmav99 Δημοσ. 11 Ιουλίου 2016 Δημοσ. 11 Ιουλίου 2016 ή και έτσι (το enumerate κάνει consume τον generator ) : from __future__ import print_function [ print(TEMPLATE.format(code="\n".join(block_i.splitlines()[1:]))) for n, block_i in enumerate ( block.strip() for block in MODULE_TEXT.split("//Block") if block.strip() ) ] Για την ιστορία, προσωπικά αποφεύγω τα nested loop comprehensions και, πλέον, και τα απλά loop comprehensions όταν τα χρησιμοποιώ μόνο για τα side effects (όταν δηλαδή δεν με ενδιαφέρει η δημιουργία της list). O βασικός λόγος είναι ότι αν χρειαστεί να προσθέσεις κάτι στο σώμα του loop είναι πιο εύκολο να το κάνεις με explicit for loops (πιο καθαρά diffs κτλ).
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα