Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Perl > How do I not store matched patterns in the $1.. strings?

Reply
Thread Tools

How do I not store matched patterns in the $1.. strings?

 
 
Jonathan
Guest
Posts: n/a
 
      12-24-2003
Ok, I have this script:

#!perl
print "Content-type: text/html\n\n";
$test[0]="Text0<\$UserA|UserB|UserC|5|>Text1";
$test[1]="Text2";
$test[2]="Text3</\$>";
my $User="UserD";
my $Rights="6";
my $Text=join "ARRAYJOINER",@test;
$Text=~s{<\$(([A-Za-z0-9-_
']+\|)+)>(.*?)</\$>}{(index("\$$1","\$$User\|")!=-1 ||
index($1,"\|$User\|")!=-1 || "\$$1"=~/(\$|\|)[0-$Rights]\|/)?$3:""}egs;
@test=split(/ARRAYJOINER/, $Text);
print $Text;
exit;

What I want is for the script to not display the text in between
<$UserA|UserB|UserC|5|> and </$> unless a person is UserA, -B, -C or has
level 5 (or higher) rights. This means that when I use this on my system,
only Admins, who are level 6 and Moderators, who are level 5, will be able
to see "Text1Text2Text3"

I thought about this and came to the conclusion this should be possible in
one line. At least the =~ part of it...when I have an idea in my head, Im
not gonna be able to get it out , so I really wanna give it a try...

The index(..) part of the code works, if the user matches it will paste the
text ($3), but the other part of it doesn't. I had to use m// for it to
allow not only the users with the same rights as needed but also with more
rights than needed. ([0-$Rights])...I think the problem is that the m//
operator clears the $3 string and gives it a different value (""). So, how
do I make perl not store the matched pattern in $1..?


 
Reply With Quote
 
 
 
 
nobull@mail.com
Guest
Posts: n/a
 
      12-25-2003
"Jonathan" <> wrote in message news:<bscmih$49c$>...
> Ok, I have this script:
>
> #!perl
> print "Content-type: text/html\n\n";
> $test[0]="Text0<\$UserA|UserB|UserC|5|>Text1";
> $test[1]="Text2";
> $test[2]="Text3</\$>";


You forgot to declare @test - use strict would have noticed this for
you.

> my $User="UserD";
> my $Rights="6";


Why "6" not 6? Yeah Perl will convert the string to a number when
necessary but why makar it do so?

> my $Text=join "ARRAYJOINER",@test;
> $Text=~s{<\$(([A-Za-z0-9-_
> ']+\|)+)>(.*?)</\$>}{(index("\$$1","\$$User\|")!=-1 ||
> index($1,"\|$User\|")!=-1 || "\$$1"=~/(\$|\|)[0-$Rights]\|/)?$3:""}egs;
> @test=split(/ARRAYJOINER/, $Text);
> print $Text;
> exit;
>
> What I want is for the script to not display the text in between
> <$UserA|UserB|UserC|5|> and </$> unless a person is UserA, -B, -C or has
> level 5 (or higher) rights. This means that when I use this on my system,
> only Admins, who are level 6 and Moderators, who are level 5, will be able
> to see "Text1Text2Text3"
>
> I thought about this and came to the conclusion this should be possible in
> one line. At least the =~ part of it...when I have an idea in my head, Im
> not gonna be able to get it out , so I really wanna give it a try...
>
> The index(..) part of the code works, if the user matches it will paste the
> text ($3), but the other part of it doesn't. I had to use m// for it to
> allow not only the users with the same rights as needed but also with more
> rights than needed. ([0-$Rights])...I think the problem is that the m//
> operator clears the $3 string and gives it a different value (""). So, how
> do I make perl not store the matched pattern in $1..?


You don't you just copy it elsewhere.

BTW: Whitespace is free. On a related matter I'd tend to use the
long-hand if-else rather than ?: for stuff that's more than
comfortably can be taken in in one glance.

You can put many statements inside the RHS of s///e but the parsing
rules of the RHS of s/// are rather gory so whenever I have a
non-trivial s///e I take the code outside.

my $s = sub {
my $t = $3;
if ( index("\$$1","\$$User\|")!=-1 ||
index($1,"\|$User\|")!=-1 ||
"\$$1"=~/(\$|\|)[0-$Rights]\|/ ) {
$t;
} else {
"";
}
};

$Text=~s/<\$(([A-Za-z0-9-_ ']+\|)+)>(.*?)</\$>/&$s/egs;

Note: I still think all this stuff with index() is a bit unreadable
and a bit long. You should always try to make your code as readable
as possible. Often making it shorter actually makes it clearer too.

if ( $1 =~ /(^|\|)($User|[0-$Rights])\|/ )

This newsgroup does not exist (see FAQ). Please do not start threads
here. Merry Christmas.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
xsl:template not getting matched tentstitcher@gmail.com XML 2 05-18-2006 12:16 AM
Substitutions in matched patterns? Anton81 Perl Misc 4 01-31-2006 02:57 PM
to store or not to store an image =?Utf-8?B?UnVkeQ==?= ASP .Net 6 03-30-2005 05:51 AM
re.split() not keeping matched text Robert Oschler Python 5 07-26-2004 02:49 PM
where to find good patterns and sources of patterns (was Re: singletons) crichmon C++ 4 07-07-2004 10:02 PM



Advertisments
 



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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57