Se eseguo uno script con perl -F
qualcosa di, è quello qualcosa di valore salvato in un ambiente Perl dove lo script può trovarlo? Mi piacerebbe scrivere uno script che riutilizza di default il delimitatore di input (se si tratta di una stringa e non di un'espressione regolare) come delimitatore di output.Ottieni il valore del delimitatore autosplit?
risposta
Guardando allo source, non penso che il delimitatore sia stato salvato da nessuna parte. Quando si esegue
perl -F, -an
il lexer in realtà genera il codice
LINE: while (<>) {our @F=split(q\0,\0);
e lo analizza. A questo punto, qualsiasi informazione sul delimitatore viene persa.
La soluzione migliore è quella di split
a mano:
perl -ne'BEGIN { $F="," } @F=split(/$F/); print join($F, @F)' foo.csv
o per passare il delimitatore come argomento per lo script:
F=,; perl -F$F -sane'print join($F, @F)' -- -F=$F foo.csv
o per passare il delimitatore come ambiente variabile:
export F=,; perl -F$F -ane'print join($ENV{F}, @F)' foo.csv
Come @ThisSuitIsBlackNot dice che sembra che il delimitatore sia stato salvato ovunque.
questo è come il perl.c memorizza il parametro -F
case 'F':
PL_minus_a = TRUE;
PL_minus_F = TRUE;
PL_minus_n = TRUE;
PL_splitstr = ++s;
while (*s && !isSPACE(*s)) ++s;
PL_splitstr = savepvn(PL_splitstr, s - PL_splitstr);
return s;
e poi il lexer genera il codice
LINE: while (<>) {our @F=split(q\0,\0);
tuttavia questo è ovviamente compilato, e se lo si esegue con B :: Sparse puoi vedere cosa viene memorizzato.
$ perl -MO=Deparse -F/e/ -e ''
LINE: while (defined($_ = <ARGV>)) {
our(@F) = split(/e/, $_, 0);
}
-e syntax OK
Essere perl c'è sempre un modo, per quanto brutto. (E questo è parte del codice più brutto che ho scritto in un po '):
use B::Deparse;
use Capture::Tiny qw/capture_stdout/;
BEGIN {
my $f_var;
}
unless ($f_var) {
$stdout = capture_stdout {
my $sub = B::Deparse::compile();
&{$sub}; # Have to capture stdout, since I won't bother to setup compile to return the text, instead of printing
};
my (undef, $split_line, undef) = split(/\n/, $stdout, 3);
($f_var) = $split_line =~ /our\(\@F\) = split\((.*)\, \$\_\, 0\);/;
print $f_var,"\n";
}
uscita:
$ perl -Fe/\\\(\\[\\\<\\{\"e testy.pl
m#e/\(\[\<\{"e#
Si potrebbe possibile attraversare il bytecode, invece, fin dall'inizio, probabilmente sarà identico ogni volta fino a raggiungere il modello.
Beh, è impressionante, ma un po 'eccessivo per la mia applicazione. Farò solo la divisione non automatica. –
- 1. Goniometro Ottieni il valore del modello
- 2. Ottieni il valore del pulsante cliccato
- 3. Ottieni il valore medio dall'elenco del dizionario
- 4. Ottieni il valore del campo nascosto Jquery?
- 5. Ottieni il valore del pulsante radio Dojo?
- 6. Ottieni la chiave del dizionario utilizzando il valore del dizionario
- 7. Ottieni il valore da NSTextField
- 8. Ottieni il valore dell'attributo personalizzato
- 9. Come ottenere il primo valore prima delimitatore in SQL Server
- 10. modifica eliminazione sed del delimitatore
- 11. Modifica delimitatore del comando uniq
- 12. Spring 3 RequestMapping: Ottieni il valore del percorso
- 13. Ottieni il valore corrente di Subject.asObservable() all'interno del servizio Angular
- 14. Ottieni il valore selezionato del menu a discesa di carta
- 15. Ottieni il valore della chiave del Registro di sistema
- 16. Ottieni l'abbreviazione del fuso orario utilizzando il valore di offset
- 17. Ottieni il valore del nome dell'attributo di <input>
- 18. ottieni il valore del tag body dal sito web
- 19. AspectJ - Ottieni il valore del parametro metodo annotato
- 20. Ottieni il valore del testo da p: inputText javascript
- 21. Ottieni il valore chiave del dizionario per indice in jQuery
- 22. Ottieni attributi personalizzati del valore enum
- 23. Ottieni il valore di Span Text
- 24. (extjs) Ottieni il valore selezionato del pulsante di opzione nel modulo. Non si restituisce il valore
- 25. SQL * Il caricatore non riconosce il delimitatore "¥"
- 26. Java/clojure: delimitatore di caratteri multipli e mantenere il delimitatore
- 27. Ottieni il valore RGB dai preset UIColor
- 28. Ottieni il valore corrente dal datalist onhover
- 29. Ottieni il valore dall'input nel modale
- 30. Ottieni il valore del dropdown in VBA e ottieni il nome del menu a discesa ... in nessun posto?
Questo è quello che temevo. Grazie. –
BTW, 'perl -F, -an' è tecnicamente ridondante; '-F' di per sé implica sia' -a' che '-n' (che puoi sovrascrivere specificando manualmente' -p'). Probabilmente è più chiaro includerli, sebbene la chiarezza non sia in genere una priorità quando si scrive un one-liner anziché uno script da salvare. :) –