home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1996 July / AMIGA_1996_7.BIN / ausgabe_7_96 / pd-programmierung / perl5_002bin.lha / bin / pl2pm < prev    next >
Text File  |  1996-03-27  |  4KB  |  351 lines

  1. #!/gnu/bin/perl
  2.     eval 'exec perl -S $0 "$@"'
  3.     if 0;
  4.  
  5. =head1 NAME
  6.  
  7. pl2pm - Rough tool to translate Perl4 .pl files to Perl5 .pm modules.
  8.  
  9. =head1 SYNOPSIS
  10.  
  11. B<pl2pm> F<files>
  12.  
  13. =head1 DESCRIPTION
  14.  
  15. B<pl2pm> is a tool to aid in the conversion of Perl4-style .pl
  16. library files to Perl5-style library modules.  Usually, your old .pl
  17. file will still work fine and you should only use this tool if you
  18. plan to update your library to use some of the newer Perl 5 features,
  19. such as AutoLoading.
  20.  
  21. =head1 LIMITATIONS
  22.  
  23. It's just a first step, but it's usually a good first step.
  24.  
  25. =head1 AUTHOR
  26.  
  27. Larry Wall <lwall@sems.com>
  28.  
  29. =cut
  30.  
  31. while (<DATA>) {
  32.     chop;
  33.     $keyword{$_} = 1;
  34. }
  35.  
  36. undef $/;
  37. $* = 1;
  38. while (<>) {
  39.     $newname = $ARGV;
  40.     $newname =~ s/\.pl$/.pm/ || next;
  41.     $newname =~ s#(.*/)?(\w+)#$1\u$2#;
  42.     if (-f $newname) {
  43.     warn "Won't overwrite existing $newname\n";
  44.     next;
  45.     }
  46.     $oldpack = $2;
  47.     $newpack = "\u$2";
  48.     @export = ();
  49.     print "$oldpack => $newpack\n" if $verbose;
  50.  
  51.     s/\bstd(in|out|err)\b/\U$&/g;
  52.     s/(sub\s+)(\w+)(\s*\{[ \t]*\n)\s*package\s+$oldpack\s*;[ \t]*\n+/${1}main'$2$3/ig;
  53.     if (/sub\s+main'/) {
  54.     @export = m/sub\s+main'(\w+)/g;
  55.     s/(sub\s+)main'(\w+)/$1$2/g;
  56.     }
  57.     else {
  58.     @export = m/sub\s+([A-Za-z]\w*)/g;
  59.     }
  60.     @export_ok = grep($keyword{$_}, @export);
  61.     @export = grep(!$keyword{$_}, @export);
  62.     @export{@export} = (1) x @export;
  63.     s/(^\s*);#/$1#/g;
  64.     s/(#.*)require ['"]$oldpack\.pl['"]/$1use $newpack/;
  65.     s/(package\s*)($oldpack)\s*;[ \t]*\n+//ig;
  66.     s/([\$\@%&*])'(\w+)/&xlate($1,"",$2)/eg;
  67.     s/([\$\@%&*]?)(\w+)'(\w+)/&xlate($1,$2,$3)/eg;
  68.     if (!/\$\[\s*\)?\s*=\s*[^0\s]/) {
  69.     s/^\s*(local\s*\()?\s*\$\[\s*\)?\s*=\s*0\s*;[ \t]*\n//g;
  70.     s/\$\[\s*\+\s*//g;
  71.     s/\s*\+\s*\$\[//g;
  72.     s/\$\[/0/g;
  73.     }
  74.     s/open\s+(\w+)/open($1)/g;
  75.  
  76.     if (s/\bdie\b/croak/g) {
  77.     $carp = "use Carp;\n";
  78.     s/croak "([^"]*)\\n"/croak "$1"/g;
  79.     }
  80.     else {
  81.     $carp = "";
  82.     }
  83.     if (@export_ok) {
  84.     $export_ok = "\@EXPORT_OK = qw(@export_ok);\n";
  85.     }
  86.     else {
  87.     $export_ok = "";
  88.     }
  89.  
  90.     open(PM, ">$newname") || warn "Can't create $newname: $!\n";
  91.     print PM <<"END";
  92. package $newpack;
  93. require 5.000;
  94. require Exporter;
  95. $carp
  96. \@ISA = qw(Exporter);
  97. \@EXPORT = qw(@export);
  98. $export_ok
  99. $_
  100. END
  101. }
  102.  
  103. sub xlate {
  104.     local($prefix, $pack, $ident) = @_;
  105.     if ($prefix eq '' && $ident =~ /^(t|s|m|d|ing|ll|ed|ve|re)$/) {
  106.     "${pack}'$ident";
  107.     }
  108.     elsif ($pack eq "" || $pack eq "main") {
  109.     if ($export{$ident}) {
  110.         "$prefix$ident";
  111.     }
  112.     else {
  113.         "$prefix${pack}::$ident";
  114.     }
  115.     }
  116.     elsif ($pack eq $oldpack) {
  117.     "$prefix${newpack}::$ident";
  118.     }
  119.     else {
  120.     "$prefix${pack}::$ident";
  121.     }
  122. }
  123. __END__
  124. AUTOLOAD
  125. BEGIN
  126. CORE
  127. DESTROY
  128. END
  129. abs
  130. accept
  131. alarm
  132. and
  133. atan2
  134. bind
  135. binmode
  136. bless
  137. caller
  138. chdir
  139. chmod
  140. chop
  141. chown
  142. chr
  143. chroot
  144. close
  145. closedir
  146. cmp
  147. connect
  148. continue
  149. cos
  150. crypt
  151. dbmclose
  152. dbmopen
  153. defined
  154. delete
  155. die
  156. do
  157. dump
  158. each
  159. else
  160. elsif
  161. endgrent
  162. endhostent
  163. endnetent
  164. endprotoent
  165. endpwent
  166. endservent
  167. eof
  168. eq
  169. eval
  170. exec
  171. exit
  172. exp
  173. fcntl
  174. fileno
  175. flock
  176. for
  177. foreach
  178. fork
  179. format
  180. formline
  181. ge
  182. getc
  183. getgrent
  184. getgrgid
  185. getgrnam
  186. gethostbyaddr
  187. gethostbyname
  188. gethostent
  189. getlogin
  190. getnetbyaddr
  191. getnetbyname
  192. getnetent
  193. getpeername
  194. getpgrp
  195. getppid
  196. getpriority
  197. getprotobyname
  198. getprotobynumber
  199. getprotoent
  200. getpwent
  201. getpwnam
  202. getpwuid
  203. getservbyname
  204. getservbyport
  205. getservent
  206. getsockname
  207. getsockopt
  208. glob
  209. gmtime
  210. goto
  211. grep
  212. gt
  213. hex
  214. if
  215. index
  216. int
  217. ioctl
  218. join
  219. keys
  220. kill
  221. last
  222. lc
  223. lcfirst
  224. le
  225. length
  226. link
  227. listen
  228. local
  229. localtime
  230. log
  231. lstat
  232. lt
  233. m
  234. mkdir
  235. msgctl
  236. msgget
  237. msgrcv
  238. msgsnd
  239. my
  240. ne
  241. next
  242. no
  243. not
  244. oct
  245. open
  246. opendir
  247. or
  248. ord
  249. pack
  250. package
  251. pipe
  252. pop
  253. print
  254. printf
  255. push
  256. q
  257. qq
  258. quotemeta
  259. qw
  260. qx
  261. rand
  262. read
  263. readdir
  264. readline
  265. readlink
  266. readpipe
  267. recv
  268. redo
  269. ref
  270. rename
  271. require
  272. reset
  273. return
  274. reverse
  275. rewinddir
  276. rindex
  277. rmdir
  278. s
  279. scalar
  280. seek
  281. seekdir
  282. select
  283. semctl
  284. semget
  285. semop
  286. send
  287. setgrent
  288. sethostent
  289. setnetent
  290. setpgrp
  291. setpriority
  292. setprotoent
  293. setpwent
  294. setservent
  295. setsockopt
  296. shift
  297. shmctl
  298. shmget
  299. shmread
  300. shmwrite
  301. shutdown
  302. sin
  303. sleep
  304. socket
  305. socketpair
  306. sort
  307. splice
  308. split
  309. sprintf
  310. sqrt
  311. srand
  312. stat
  313. study
  314. sub
  315. substr
  316. symlink
  317. syscall
  318. sysread
  319. system
  320. syswrite
  321. tell
  322. telldir
  323. tie
  324. time
  325. times
  326. tr
  327. truncate
  328. uc
  329. ucfirst
  330. umask
  331. undef
  332. unless
  333. unlink
  334. unpack
  335. unshift
  336. untie
  337. until
  338. use
  339. utime
  340. values
  341. vec
  342. wait
  343. waitpid
  344. wantarray
  345. warn
  346. while
  347. write
  348. x
  349. xor
  350. y
  351.