http://qs321.pair.com?node_id=559072

in reply to The craziest RegExes you ever created

This is a very silly script I wrote to demonstrate the very possibility of how something could be done this way. The regex is to convert roman numerals to integers. It is neither useful nor witty.

```use strict;

sub l { return length shift }
sub roman2int {
\$_ = shift;
/(M*)(?{\$a+=1000*l\$1})(D*)(?:(?!M)(?{\$a+=500*l\$2})|(?{\$a-=500*l\$2}
+))(C*)(?:(?![MD])(?{\$a+=100*l\$3})|(?{\$a-=100*l\$3}))(L*)(?:(?![MDC])(?
+{\$a+=50*l\$4})|(?{\$a-=50*l\$4}))(X*)(?:(?![MDCL])(?{\$a+=10*l\$5})|(?{\$a-
+=10*l\$5}))(V*)(?:(?![MDCLX])(?{\$a+=5*l\$6})|(?{\$a-=5*l\$6}))(I*)(?:(?![
+MDCLXV])(?{\$a+=1*l\$7})|(?{\$a-=1*l\$7}))(M*)(?{\$a+=1000*l\$8})(D*)(?{\$a+
+=500*l\$9})(C*)(?:(?![MD])(?{\$a+=100*l\$10})|(?{\$a-=100*l\$10}))(L*)(?:(
+?![MDC])(?{\$a+=50*l\$11})|(?{\$a-=50*l\$11}))(X*)(?:(?![MDCL])(?{\$a+=10*
+l\$12})|(?{\$a-=10*l\$12}))(V*)(?:(?![MDCLX])(?{\$a+=5*l\$13})|(?{\$a-=5*l\$
+13}))(I*)(?:(?![MDCLXV])(?{\$a+=1*l\$14})|(?{\$a-=1*l\$14}))(C*)(?{\$a+=10
+0*l\$15})(L*)(?:(?![MDC])(?{\$a+=50*l\$16})|(?{\$a-=50*l\$16}))(X*)(?:(?![
+MDCL])(?{\$a+=10*l\$17})|(?{\$a-=10*l\$17}))(V*)(?:(?![MDCLX])(?{\$a+=5*l\$
+18})|(?{\$a-=5*l\$18}))(I*)(?:(?![MDCLXV])(?{\$a+=1*l\$19})|(?{\$a-=1*l\$19
+}))(L*)(?{\$a+=100*l\$20})(X*)(?:(?![MDCL])(?{\$a+=10*l\$21})|(?{\$a-=10*l
+\$21}))(V*)(?:(?![MDCLX])(?{\$a+=5*l\$22})|(?{\$a-=5*l\$22}))(I*)(?:(?![MD
+CLXV])(?{\$a+=1*l\$23})|(?{\$a-=1*l\$23}))(X*)(?{\$a+=10*l\$24})(V*)(?:(?![
+MDCLX])(?{\$a+=5*l\$25})|(?{\$a-=5*l\$25}))(I*)(?:(?![MDCLXV])(?{\$a+=1*l\$
+26})|(?{\$a-=1*l\$26}))(X*)(?{\$a+=10*l\$27})/;
return \$a;
}
print roman2int shift;