Christian: RegEx mit backreference - map oder foreach?

Hi,

ich habe ein Array @lines, worauf ich einen RegEx anwenden möchte:

foreach (@lines) {
  s/^([^$]*)$.*$/$1/;
}

Von jeder Zeile wird also nur der Anfang bis zum ersten Dollarzeichen behalten.

Könnt ihr mir sagen, warum das so nicht funktioniert?

@lines = map( s/^([^$]*)$.*$/$1/ , @lines);

Damit wird jede Zeile durch "1" ersetzt.

Schöne Grüße
Christian :)

  1. Hi,

    @lines = map( s/^([^$]*)$.*$/$1/ , @lines);

    Damit wird jede Zeile durch "1" ersetzt.

    Natürlich. In jeder Zeile wird ja auch genau eine Ersetzung durchgeführt - der Rückgabewert von s/// ist die Anzahl der Ersetzungen.

    Willst Du
    s/^([^$]*)$.*$/$1/ foreach (@lines);
    ?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hi,

      so macht das natürlich alles Sinn, danke dir Andreas! :)

      Grüße
      Christian

  2. Hallo Christian,

    Könnt ihr mir sagen, warum das so nicht funktioniert?
    @lines = map( s/^([^$]*)$.*$/$1/ , @lines);

    die Lösung hat dir MudGuard schon gegeben.
    Die richtige Lösung mit map würde so aussehen:

      
    my @nLines = map { /^([^\$]*)\$.*$/ } @lines;  
    
    

    du kannst dir im Prinzip merken, dass innerhalb von map fast nie eine Ersetzung vorkommt. In diesen Fällen verwendet man idR. for(each).

    Gruß,
    Benne

    --
    ie:% fl:( br:> va:) ls:> fo:| rl:° ss:) de:[ js:| ch:| mo:} zu:)