From: Daniel Martin Date: 2006-07-15T21:43:42+09:00 Subject: Re: Help with a regexp Logan Capaldo writes: > On Jul 14, 2006, at 2:16 PM, dblack@wobblini.net wrote: > >> Is ??{ code } in Perl different from #{...} in Ruby? (Not that I was >> able to solve Daniel's problem with #{...}, but I'm just curious about >> the comparison.) > > > I apologize to any perlers if this isn't idiomatic (or clean) perl, I > never had to use this kind of magic in my perl days and I had > difficulty getting it to work when I stored the regexp in a variable. > But the point is, is that it does work. Which is kind of scary. I think you probably had trouble with the \ when you tried storing it in a variable because of quoting issues. So use qr, the perl equivalent of ruby's %r: $s1 = "3:abc"; $s2 = "24:abc"; $regexp = qr/(\d+):(??{'\w{' . $1 . '}'})/; print "Good\n" if ( $s1 =~ $regexp); print "Bad\n" if ( $s2 =~ $regexp); Although, since bencoded strings can contain any character, and not just word characters, what you really want is: $regexp = qr/(\d+):(??{".{$1}"})/; Perl allows bunches of special constructs in regular expressions that sane languages, which like to keep the matching of regular expressions away from being able to jump back into the host language. (Note that perl combines this feature with extra language-level security support, since most programmers would assume that a user-supplied regexp couldn't execute arbitrary code) For more examples, google "perlre". Incidentally, I've just been able to reproduce as much of bencoding as I implemented in ruby earlier in a pair of nasty perl regular expressions. I won't post it, since this is ruby-talk and not perl-regex-nastiness-talk, but people who really want to see it can look at http://paste.lisp.org/display/22637 It doesn't technically decode every possible bencoded string, because limitations in perl's regexp engine don't let me say .{n} where "n" is larger than about 32000 while a bencoded string can in theory have a length up to 65535. But other than that, it should implement the entire bencode spec.