---
title: "Filhantering"
type: "forum-thread"
url: "https://www.webforum.nu/amne/perl-ruby/99772-filhantering"
topic: "Perl & Ruby"
topic_url: "https://www.webforum.nu/amne/perl-ruby"
author: "dd"
published: "2004-03-18T17:42:27.000Z"
updated: "2004-03-20T17:15:29.000Z"
replies: 4
views: 317
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/perl-ruby/99772-filhantering"
---

# Filhantering

## #1 — dd, 2004-03-18T17:42Z

Hej, nu behöver jag lite hjälp i perl som jag inte förstår mycket av...

Jag hämtar information ur följande fil med hjälp av:

open (FILE,"\<..minfil.txt"); 
@fildata=\<FILE\>;
foreach $rad(@fildata)
{
	print $rad."\<br\>";
}

close (FILE); 

Den skriver ut alla och avslutar raden med nyrad. 

Problemet är att jag inte vill att den ska skriva ut hela raden, jag vill att den avslutar varje utskrift vid tex ett tecken eller ord. 

Namn: Förnamn Efternamn Adress: gatan 13 

om jag vill att den ska avsluta läsning innan Adress, hur gör jag då?

Permalänk: https://www.webforum.nu/p/99772

## #2 — Jojoxx, 2004-03-18T21:39Z

Det beror på. Vad skall ske om inte " Adress:" finns exempelvis? Men det kanske det alltid gör...

```
foreach $rad(@fildata)
{
	@rad=($rad=~m/(.*) Adress:/);
	print $rad[0]."<br>";
}
```

Eller om du inte gillar RegExp;

```
foreach $rad(@fildata)
{
	print substr($rad,0,index($rad," Adress:"))."<br>";
}
```

Permalänk: https://www.webforum.nu/p/1303414

## #3 — dd, 2004-03-18T21:56Z

Tack tack

har suttit och klurat ut det hela med split men detta fungerar mycket bättre. 

Hur skulle man göra om jag låt säga bara vill plocka ut de personer som tex bor på "webbvägen", dvs söka rätt och lista de de rader i textfilen som innehåller webbvägen.

har suttit en del med php och mysql och det här med perl och textfiler var ingen lek...

Permalänk: https://www.webforum.nu/p/1303442

## #4 — Jojoxx, 2004-03-19T09:52Z

Ett litet exempel:

```
foreach $rad(@fildata)
{
	chomp $rad;
	my (%field);
	my @f=split(/(\w+): /,$rad);
	for(my $n=1;$n<$#f;$n+=2){ $field{$f[$n]}=$f[$n+1]; }
	next unless ($field{'Adress'}=~/webbgatan/i);
	print $field{'Namn'}."<br>";
}
```

Här läser vi alltså av varje rad till en s.k. hash där vi sedan jämför fältet "Adress" med "webbgatan".

Permalänk: https://www.webforum.nu/p/1303654

## #5 — Hansen, 2004-03-20T17:15Z

Hej,

En annan variant :)

Fältnamn kan innehålla alla tecken utom kolon. Den tar inte med mellanslag som är i början eller slutet av värdet.

```
#!/usr/bin/perl

use strict;
use warnings;

use IO::File;

my $fh = new IO::File;

unless ( $fh->open( "flat.txt", O_RDONLY ) ) {
    die( "Failed to open file: flat.txt. Reason: ", $! );
}

my @matches = ();

while ( my $line = $fh->getline ) {

    my $record = {};

    while ( $line =~ m/ (\S+): \s+ ( .*? (?: (?=\s+\S+:\s+) | $ ) ) /gx ) {
        $record->{ lc($1) } = $2;
    }

    if ( $record->{adress} and $record->{adress} =~ /webbvägen/i ) {
        push( @matches, $record );
    }
}

unless ( $fh->close ) {
    die( "Failed to close file: flat.txt. Reason: ", $! );
}

printf( "Hittade %s matchande träffar\n\n", scalar(@matches) || "inga" );

while ( my $record = shift(@matches) ) {
    printf("%s har adressen %s.\n", $record->{namn}, $record->{adress} );
}

__END__
Namn: Christian Hansen Ort: Malmö Adress: Annanvägen 6 A
Namn: D D Adress: Webbvägen 43 B
Namn: Jojoxx Adress: Webbvägen 1 A
```

Permalänk: https://www.webforum.nu/p/1304363

---

Tråden på webben: https://www.webforum.nu/amne/perl-ruby/99772-filhantering
