J'ai un script Perl pour analyser plusieurs mégaoctets de données ligne par ligne. Par exemple, j'utiliserai la clôture du Dow Jones Average par jour sur plusieurs lignes.Perl: Template pour un tableau anonyme?
Les données sont lues et la mise en page des données dans le fichier est simple. Dans cet exemple, il est:
Date Open High Low Close Volume Adj-Close
Comme je l'ai lu les données, de nombreux calculs sont effectués. Certaines des données et les calculs sont conservés pour une utilisation ultérieure. Disons que les nouvelles données sont:
Date Open Adj-Close %change [more data to be added]
Voici quelques exemples de code:
use warnings; use strict;
my @trades;
while(<DATA>) {
chomp;
my ($year,$mon,$day,$open,$high,$low,$close,$vol,$ad_close);
if(($year,$mon,$day,$open,$high,$low,$close,$vol,$ad_close)=
/^(\d+)-(\d+)-(\d+), #date YYYY-MM-DD
(\d+\.\d+), #open
(\d+\.\d+), #High
(\d+\.\d+), #Low
(\d+\.\d+), #Close
(\d+), #Vol
(\d+\.\d+)/x) #adj cl
{
my $drp=($ad_close-$open)/$open;
# HERE Created:
push @trades, [$year,$mon,$day,$open,$ad_close,$drp];
}
else {
print "$_ does not match...\n";
}
}
# widely separated and in multiple places...
foreach my $trade_ref (@trades) {
#HERE Referenced
my ($year,$mon,$day,$open,$ad_close,$drp)[email protected]$trade_ref;
print "$year-$mon-$day $open,$ad_close,$drp\n";
}
# Dow Jones data by day...
__DATA__
2010-10-08,10948.50,11055.29,10901.12,11006.48,3871420000,11006.48
2010-10-07,10968.41,11032.17,10878.04,10948.58,3910550000,10948.58
2010-10-06,10936.79,11015.86,10880.08,10967.65,4073160000,10967.65
2010-10-05,10752.63,10982.98,10752.63,10944.72,4068840000,10944.72
2010-10-04,10828.85,10875.54,10682.66,10751.27,3604110000,10751.27
2010-10-01,10789.72,10907.41,10759.14,10829.68,4298910000,10829.68
2010-09-30,10835.96,10960.99,10732.27,10788.05,4284160000,10788.05
2010-09-29,10857.98,10901.96,10759.75,10835.28,3990280000,10835.28
2010-09-28,10809.85,10905.44,10714.03,10858.14,4025840000,10858.14
2010-09-27,10860.03,10902.52,10776.44,10812.04,3587860000,10812.04
2010-09-24,10664.39,10897.83,10664.39,10860.26,4123950000,10860.26
2010-09-23,10738.48,10779.65,10610.12,10662.42,3847850000,10662.42
2010-09-22,10761.11,10829.75,10682.40,10739.31,3911070000,10739.31
2010-09-21,10753.39,10844.89,10674.83,10761.03,4175660000,10761.03
2010-09-20,10608.08,10783.51,10594.38,10753.62,3364080000,10753.62
2010-09-17,10595.44,10689.29,10529.67,10607.85,4086140000,10607.85
2010-09-16,10571.75,10624.58,10499.43,10594.83,3364080000,10594.83
2010-09-15,10526.42,10609.21,10453.15,10572.73,3369840000,10572.73
2010-09-14,10544.81,10622.69,10460.34,10526.49,4521050000,10526.49
2010-09-13,10458.60,10605.73,10458.45,10544.13,4521050000,10544.13
2010-09-10,10415.01,10502.80,10376.34,10462.77,3061160000,10462.77
2010-09-09,10388.22,10515.86,10359.23,10415.24,3387770000,10415.24
2010-09-08,10338.57,10460.50,10318.93,10387.01,3224640000,10387.01
2010-09-07,10446.80,10448.99,10304.44,10340.69,3107380000,10340.69
2010-09-03,10321.92,10484.71,10321.92,10447.93,3534500000,10447.93
2010-09-02,10270.08,10350.98,10211.80,10320.10,3704210000,10320.10
2010-09-01,10016.01,10305.87,10016.01,10269.47,4396880000,10269.47
2010-08-31,10006.42,10101.53,9915.73,10014.72,4038770000,10014.72
Au lieu dans le code marqué #Ici, notez que je suis pousser un tableau anonyme sur un autre tableau nommé pour un accès ultérieur. Plus tard (beaucoup plus tard dans le vrai programme) j'accède au même tableau par référence.
Jusqu'à présent, je viens de couper le texte du "modèle" [$year,$mon,$day,$open,$ad_close,$drp]
du premier # ICI et coller manuellement my ($year,$mon,$day,$open,$ad_close,$drp)[email protected]$trade_ref;
dans les autres # ICI dans le programme. Doit être un meilleur moyen ...
Y a-t-il un moyen pour que je puisse avoir un modèle du tableau anonyme que j'appuie afin qu'il soit automatiquement référencé de manière ordonnée dans les autres cas à travers le script? Dans le script réel, les résultats analysés tels que $drp
changent et je veux un changement dans la création des données à gérer gracieusement par les routines ultérieures même si je ne change pas my ($year,$mon,$day,$open,$ad_close,$drp)[email protected]$trade_ref;
S'il s'agissait d'un programme C, la définition pourrait être un macro dans un seul endroit ...
Je songe à pousser un hachage anonyme au lieu d'un tableau avec le hachage ayant des paires nom/valeur qui ont le nom de la valeur puis la valeur de cette valeur. Théoriquement, je sais que cela fonctionnerait, mais cela me semble inutile et lent. Il y a environ 2 Go de données dans le jeu de données réel, et je peux le faire rapidement avec la conception actuelle.
Y a-t-il un meilleur moyen?
Vous pouvez enregistrer une ligne de code dupliqués en faisant la déclaration des variables et l'affectation ensemble: 'si (ma (année $, ...) = ...)' – daxim