Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω μια ιδιαίτερη κατάσταση στην οποία προσπαθώ να βρώ εύκολη λύση και δεν μου έρχεται κάτι. Γράφω 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 ή κάτι που μου διαφεύγει τώρα.

 

Οποιαδήποτε βοήθεια / ιδέα ευπρόσδεκτη.

Δημοσ.

Ε αν είναι έτσι εύκολα τα πράγματα με στάνταρ 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;
}
  • Like 2
Δημοσ.

Κατ' ουσίαν το ίδιο με αυτό που προτείνει ο 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))

  • Like 2
Δημοσ.

Cool, με λίγο πείραγμα παίξαν και τα δύο... αν και το πρώτο regex κάνει match όλα χωρις το τελευταίο block αλλά πολύ μικρο το κακό :P

Mάλλον με python θα γίνει γιατί βολεύει ;)

Δημοσ.

Κατ' ουσίαν το ίδιο με αυτό που προτείνει ο 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()
    ]
  )
] 

Δημοσ.

ή και έτσι (το enumerate κάνει consume τον generator :P) :

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 κτλ).

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...