Leser: 25
1
2
$test = "\\includegraphic[adsfasdf]{dasistmeinstring.tex}";
@myarray = ($test =~ m/(\\includegraphic.*\{\w*\.\w*\})/);
2011-03-22T15:43:03 rooney10Gibt es hierfür eine bessere Lösung, welche mir immer genau den Dateinamen findet?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use strict;
my ($buffer, $tag) = ('',0);
my @res = ();
while(read DATA, my $c, 1){
if($c eq '{'){
$tag = 1;
$buffer .= $c if $c ne '{';
}
$buffer .= $c if($tag && $c ne '{' && $c ne '}');
if($c eq '}'){
push @res, $buffer;
$tag = 0;
$buffer = '';
}
}
print join "\n", @res;
__END__
Hier steht was {irgendwas} und {wieder was} und
in einer neuen Zeile steht {nochwas}. Das wars.
1 2 3 4 5
if($c eq '{'){ $tag = 1; # wir sind hier, weil $c gleich '{' ist; so wird $buffer nie gefüllt und die folgende Zeile ist daher überflüssig. $buffer .= $c if $c ne '{'; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
use strict; my ($buffer, $tag) = ('',0); my @res = (); while(read DATA, my $c, 1){ if($c eq '{'){ $tag = 1; } elsif($c eq '}'){ push @res, $buffer; $tag = 0; $buffer = ''; } else { $buffer .= $c if $tag == 1; } } print join "\n", @res, "\n"; __DATA__ Hier steht was {irgendwas} und {wieder was} und in einer neuen Zeile steht {nochwas}. Das wars.
2011-03-22T16:54:26 LinuxerIch würde Deinen Vorschlag so umschreiben...:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#!/usr/bin/perl use strict; use warnings; while(my $line=<DATA>) { while($line=~/\\includegraphics\[.*?\]\{(.+?)\}/gc) { my $pfad=$1; print "Pfad: $pfad\n"; } } __DATA__ \includegraphics[Optionen]{AAA/BBB} \includegraphics[Optionen]{AAA/CCC} bla bla bla bla bla bla bla \includegraphics[Optionen]{BBB/CCC} bla bla \includegraphics[Optionen]{DDD/EEE} bla bla bla \includegraphics[Optionen]{DDD/FFF} bla bla bla bla bla bla bla bla \includegraphics[Optionen]{FFF/GGG} bla bla bla bla bla bla
2011-03-22T16:27:06 topegCode: (dl )1
2
3
4
5
6while($line=~/\\includegraphics\[.*?\]\{(.+?)\}/gc)
{
my $pfad=$1;
print "Pfad: $pfad\n";
}
}
while($line=~/\\includegraphics.*\{(.+?)\}/gc)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#! /usr/bin/perl use strict; use warnings; my $text = do { local $/; <DATA> }; my @matches; while ( $text =~ m<\\includegraphics(?:\[.*?\])?\{(.+?)\}>gc ) { push @matches, $1; } { local $\ = local $, = $/; print @matches; } __DATA__ Schau mal dies: \includegraphics{bild1.jpg} Oder dieses: \includegraphics[2,"second"]{bild2.jpg} Aber nicht das hier: \includegraphicsNew{no_pic.jpg}
2011-03-22T22:59:17 rooney10Und abschließend noch die Frage allgemein, was bedeutet das /gc am Ende des Regex? das /g bedeutet, dass er den ganzen String durchsuchen soll und die Position mitspeichern soll. Durch das /c wird die Position behalten, auch wenn kein match kommt?!? Stimmt das so?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#! /usr/bin/perl use strict; use warnings; my $text = do { local $/; <DATA> }; my @matches; print $text; while ( $text =~ m<\\includegraphics(?:\[.*?\])?\{(.+?)\}>gc ) { push @matches, $1; print "Treffer bei Position ", pos($text), "\n"; } print "Stehe nun bei Position ", pos($text), "\n"; # ohne /c ist hier pos($text) nicht definiert... { local $\ = local $, = $/; print @matches; } __DATA__ Schau mal dies: \includegraphics{bild1.jpg} Oder dieses: \includegraphics[2,"second"]{bild2.jpg} Aber nicht das hier: \includegraphicsNew{no_pic.jpg}