2013-02-01 3 views
0

Je veux obtenir les éléments uniques (lignes) d'un fichier que je vais envoyer plus loin par e-mail. J'ai essayé 2 méthodes, mais les deux ne fonctionnent pas:Élément unique dans le fichier - perl

1er chemin:

my @array = "/tmp/myfile.$device"; 
my %seen =(); 
my $file = grep { ! $seen{ $_ }++ } @array; 

2ème façon:

my $filename = "/tmp/myfile.$device"; 
cat $filename |sort | uniq > $file 

Comment puis-je faire?

+2

'sort -u $ filename> fichier' de $ ferait avec une commande Unix ce que vous faites en trois commandes. –

Répondre

0

Si vous rig la liste des arguments, vous pouvez Perl ouvrir le fichier automatiquement, en utilisant:

perl -n -e 'BEGIN{@ARGV=("/tmp/myfile.device");} print if $count{$_}++ == 0;' 
+0

Merci mais comment affecter la sortie ci-dessus à mon fichier ... .beacuse mon but est d'envoyer l'information de dossier que j'ai assignée à $ contenu vai mail ... 'my $ F; die $! if (! open ($ F, "/ tmp/myfile.device")); mon @array = <$F>; mon% vu =(); mon $ file = grep {! $ vu {$ _} ++} @array; $ logger-> debug (détails du fichier "$ logid >>: $ file"); ouvrir mon $ ifh, '<', $ fichier ou mourir "Impossible d'ouvrir '$ fichier' pour la lecture: $!"; local $/= ''; my $ contents = <$ifh>; close ($ ifh); ' $ smtp-> datasend (" $ contents \ n \ n \ n "); – user28104

+0

La commande imprime sur la sortie standard; exécutez 'script perl> file' pour l'obtenir dans un fichier. Ou ouvrez le fichier dans le script (clause BEGIN: 'open my $ h, '>', 'file' ou die;') et modifiez le 'print' pour référencer le handle de fichier:' print $ fh $ _; '(Je ne voudrais pas omettre le '$ _' dans cette notation, bien qu'il puisse fonctionner correctement Notez l'absence d'une virgule entre' $ fh' et '$ _'.) Il pourrait y avoir un problème de portée avec' $ fh' , auquel cas, vous devrez faire un peu plus de travail. Fondamentalement, le script que j'ai proposé est un peu de triche, et serait mieux dans le cadre d'un script shell que dans le cadre d'un plus grand programme Perl. –

+0

La raison en est que l'option '-n' crée une boucle autour de l'instruction' print' (la partie non-BEGIN du code) qui lit automatiquement les lignes de la liste des arguments, mais ne les imprime pas automatiquement ('-p' s'imprimerait automatiquement). Si le flux global du programme ne correspond pas à cette structure, cette suggestion n'est pas très utile. (Et même dans un script shell, utiliser 'sort -u' serait probablement mieux que d'utiliser un script Perl pour 'le même travail'.) –

1

Vous devez ouvrir le fichier et le lire.

« chat » est une commande shell ne perl

Essayez quelque chose comme ça

my $F; 
die $! if(!open($F,"/tmp/myfile.$device")); 
my @array = <$F>; 
my %seen =(); my $file = grep { ! $seen{ $_ }++ } @array; 

Le die $! arrêtera le programme avec une erreur si le fichier ne s'ouvre pas correctement; @array=<$F> lit toutes les données du fichier $F ouvert au-dessus dans le tableau.

+0

Merci Jonathan, j'ai essayé mais quand j'imprime la sortie du fichier sa valeur d'affichage 2 au lieu de noms de périphériques .... 'my $ F; die $! if (! open ($ F, "/ tmp/monfichier. $ périphérique")); mon @array = <$F>; mon% vu =(); mon $ file = grep {! $ vu {$ _} ++} @array; $ $ logger-> debug ("$ logid >> détails du fichier: $ file"); ' La sortie devrait être comme Devicename 1 Devicename 2 .... – user28104

4

Vous semblez avoir oublié de lire le fichier!

open(my $fh, '<', $file_name) 
    or die("Can't open \"$file_name\": $!\n"); 

my %seen; 
my @unique = grep !$seen{$_}++, <$fh>;