Changeset 14512 for misc/runpugs
- Timestamp:
- 10/24/06 18:30:58 (2 years ago)
- Location:
- misc/runpugs
- Files:
-
- 14 modified
-
bin/termdispatcher.pl (modified) (1 diff)
-
bin/termdispatcher2.pl (modified) (1 diff)
-
cgi-bin/runpugs (modified) (2 diffs)
-
cgi-bin/runpugs2 (modified) (9 diffs)
-
data/runpugs.html (modified) (1 diff)
-
data/runpugs2.html (modified) (1 diff)
-
htdocs/runpugs.css (modified) (7 diffs)
-
lib/Web/Terminal/Dispatcher.pm (modified) (2 diffs)
-
lib/Web/Terminal/Server.pm (modified) (8 diffs)
-
lib/Web/Terminal/Server/Session.pm (modified) (8 diffs)
-
lib/Web/Terminal/Settings.pm (modified) (5 diffs)
-
lib/WebTerminal/Dispatcher.pm (modified) (2 diffs)
-
lib/WebTerminal/Server.pm (modified) (6 diffs)
-
lib/WebTerminal/Server/Terminal.pm (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
misc/runpugs/bin/termdispatcher.pl
r14225 r14512 15 15 print "Sending msg $id: $cmd\n"; 16 16 my $ip="127.0.0.1"; 17 my $reply = &WebTerminal::Dispatcher::send($id,$ip,$prompt.$cmd); 17 my $dev=1; 18 my $reply = &WebTerminal::Dispatcher::send($id,$ip,$dev,$prompt.$cmd); 18 19 print $reply; 19 20 -
misc/runpugs/bin/termdispatcher2.pl
r14449 r14512 12 12 13 13 my $id=$ARGV[0]||-1; 14 my $cmd=$ARGV[1] || 'my $a='.$id.';say "Hello, $a";'; 14 my $cmd=$ARGV[1] || 'print "hello\n";say "there";print 4'; 15 #my $cmd=$ARGV[1] || 'my $a='.$id.';'."\n".'say "Hello, $a";'."\n".'print 1;'; 16 #my $cmd=$ARGV[1] || 'my $a='.$id.';'.'say "Hello, $a";'.'print 1;'; 15 17 #my $cmd='my $a='.$id.';say "Hello, $a";'; 16 18 #my $prompt='pugs> '; 17 my $prompt='Prelude> ';19 #my $prompt='Prelude> '; 18 20 print "Sending msg $id: $cmd\n"; 19 21 my $ip="127.0.0.1"; 20 (my $reply,my $prompt,my $histref) = &Web::Terminal::Dispatcher::send($id,$ip,$prompt.$cmd); 22 (my $reply,my $prompt,my $histref) = 23 &Web::Terminal::Dispatcher::send($id,$ip,0,0,$cmd); 21 24 print $reply; 22 25 print "\nHistory\n"; -
misc/runpugs/cgi-bin/runpugs
r14430 r14512 96 96 my $reply='pugs> '; 97 97 my $testing=$query->param('testing')||1; 98 my $dev=$query->param('reldev')||0; 99 $dev=$dev*1; 98 100 if (not $testing) { 99 101 $reply = "Sorry, runpugs is not available at the moment."; … … 113 115 $cmd=~s/$1/:q/; 114 116 } 115 $reply = &WebTerminal::Dispatcher::send($sessionid,$ip,$ cmd);117 $reply = &WebTerminal::Dispatcher::send($sessionid,$ip,$dev,$cmd); 116 118 $reply="\n".$reply; 117 119 } 118 120 } 119 121 #$reply.="\n$ip\n$sessionid\n"; 122 my $devc=''; 123 my $relc='checked'; 124 if($dev==1) { 125 $devc='checked'; 126 $relc=''; 127 } 120 128 my $html=''; 121 129 open(HTML,"<../data/runpugs.html"); 122 130 while(<HTML>) { 123 131 s/_TESTING_/$testing/; 132 s/_DEV_/$devc/; 133 s/_REL_/$relc/; 124 134 /input.*name=\"sessionid\"/ && do {$html.='<input type="hidden" name="sessionid" value="'.$sessionid.'">'."\n";next }; 125 135 /(pugs\>\;\ \;)/ && do {$html.=$cmd.$reply;next}; -
misc/runpugs/cgi-bin/runpugs2
r14449 r14512 96 96 my $sessionid=shift; 97 97 my $ip=shift; 98 # my $prompt=$Web::Terminal::Settings::prompt; 98 my $dev=$query->param('reldev')||0; 99 $dev=$dev*1; 100 my $devc=''; 101 my $relc='checked'; 102 if($dev==1) { 103 $devc='checked'; 104 $relc=''; 105 } 106 my $ia=$query->param('ia')||0; 107 my $interactive=$ia*1; 108 my $html=''; 109 if ($interactive==1) { 110 my $clear=0; 99 111 my $nprompt=$query->param('prompt')||$prompt; 100 112 my $preply=''; … … 105 117 my @history=(); 106 118 my $prevcmd=''; 107 my $testing= $query->param('testing')||1;108 if ( not $testing) {119 my $testing=0; 120 if ($testing==1) { 109 121 $reply = "Sorry, runpugs is not available at the moment."; 110 122 } else { … … 117 129 } 118 130 if ($cmd=~/clear/) { 131 $clear=1; 119 132 $cmd=''; 120 133 $preply=''; … … 128 141 $cmd=~s/$1/:q/; 129 142 } 130 ($reply, $nprompt, my $histref) = &Web::Terminal::Dispatcher::send($sessionid,$ip,$ cmd);143 ($reply, $nprompt, my $histref) = &Web::Terminal::Dispatcher::send($sessionid,$ip,$dev,$interactive,$cmd); 131 144 if (defined $histref) { 132 145 @history=@{$histref}; … … 146 159 my $replyw="$preply$prompt$prevcmd\n$reply"; 147 160 # $prompt=$nprompt; 148 if($ preply eq '' and $cmd eq '') {161 if($clear==1) { 149 162 $replyw=''; 150 163 } … … 155 168 my $historylist="\n"; 156 169 for my $entry (@history) { 157 $entry=~s/\>/\>\;/g; 158 $historylist.='<option value="'.$entry.'">'.$entry.'</option>'."\n"; 159 } 160 my $html=''; 170 my $entryw=HTML::Entities::encode_entities($entry); 171 $historylist.='<option value="'.$entryw.'">'.$entryw.'</option>'."\n"; 172 } 161 173 open(HTML,"<../data/runpugs2.html"); 162 174 while(<HTML>) { … … 165 177 next; 166 178 }; 167 s/_TESTING_/$testing/; 179 s/_DEV_/$devc/; 180 s/_REL_/$relc/; 168 181 /input.*name=\"sessionid\"/ && do { 169 182 $html.='<input type="hidden" name="sessionid" value="'.$sessionid.'">'."\n"; … … 204 217 } 205 218 close HTML; 219 220 } else { #not-interactive 221 my $script=$query->param('script')||''; 222 (my $reply,my $nprompt, my $histref) = 223 &Web::Terminal::Dispatcher::send($sessionid,$ip,$dev,$interactive,$script); 224 my $nrows=scalar split("\n",$reply); 225 # $nrows++; 226 ($reply=~/^\s*$/) && ($nrows=1); 227 if ($nrows>20) {$nrows=20;} 228 open(HTML,"<../data/runpugs2s.html"); 229 while(<HTML>) { 230 s/_DEV_/$devc/; 231 s/_REL_/$relc/; 232 s/_NROWS_/$nrows/; 233 /_REPLYW_/ && do { 234 chomp $html; 235 $html.=$reply; 236 next; 237 }; 238 /_SCRIPT_/ && do { 239 chomp $html; 240 $html.=$script; 241 next; 242 }; 243 /([^\`\\]+$)/ && do {$html.=$1}; 244 } 245 close HTML; 246 } 206 247 &printhttpheader(); 207 248 print $html; … … 211 252 ################### PRINTHTTPHEADER ####################### 212 253 sub printhttpheader { 213 # my $cookie;214 254 unless ($headerprinted) { 215 216 # if ($sessionid) { 217 # $cookie = $query->cookie( -name => 'sessionid', 218 # -"value" => $sessionid, 219 # -path => '/' ); 220 # } 221 222 $headerprinted=1; 223 224 # if ($sessionid) { 225 # print $query->header(-pragma=>'no-cache', 226 # -cookie=>$cookie, 227 # -charset=>$lang_charset, 228 # ); 229 # } else { 255 $headerprinted=1; 230 256 print $query->header(-pragma=>'no-cache', 231 257 -charset=>$lang_charset, 232 258 ); 233 # }234 259 } 235 260 } -
misc/runpugs/data/runpugs.html
r14380 r14512 27 27 <div id="mainwindow"> 28 28 <h1>Run Perl 6 now -- in your browser!</h1> 29 <p>This live web terminal runs the latest development snapshot of 30 the <a href="http://www.pugscode.org">pugs</a> interpreter for <a 29 <p>This live web terminal runs the <a href="http://www.pugscode.org">pugs</a> interpreter for <a 31 30 href="http://dev.perl.org/perl 6/">Perl 6</a>. For more details, read the <a 32 31 href="http://feather.perl6.nl/~andara/runpugs/">info page</a>. 33 32 </p> 34 <form style="text-align: center" id="term" name="terminal" action="/cgi-bin/runpugs" method="POST"> 33 <p>By default, the Pugs session will use the <a 34 href="http://search.cpan.org/search?query=perl6%3A%3Apugs&mode=module">latest 35 release</a>. To use the latest development snapshot, change the setting 36 below.</p> 37 38 <form id="term" name="terminal" action="/cgi-bin/runpugs" method="POST"> 35 39 36 40 <input type="hidden" name="testing" value="_TESTING_"> 37 41 <input type="hidden" name="sessionid" value=""> 38 42 <input type="hidden" name="action" value="runpugs"> 43 <!--<fieldset>--> 44 <input type="radio" id="rel" value="0" name="reldev" _REL_ ><label 45 for="rel">Release</label> 46 <input type="radio" id="dev" value="1" name="reldev" _DEV_ ><label for="dev">Development</label> 47 <!--</fieldset>--> 48 <h2>Interactive Pugs Session</h2> 39 49 <!--<textarea id="history" name="history" rows="1" cols="1" 40 50 style="overflow: hidden; border: 0px; width: 0px; 41 51 font-size:0px">_CMD_</textarea>--> 42 < label for="cmd">Interactive Pugs Session<br>52 <!--<label for="cmd">Interactive Pugs Session<br>--> 43 53 <textarea id="cmd" name="cmd" rows="24" cols="80" wrap="virtual" onKeyPress="return submitenter(this,event)"> 44 54 pugs> 45 55 </textarea> 46 < /label>56 <!--</label>--> 47 57 <br> 48 58 <input id="enter" type="submit" value="Submit"> -
misc/runpugs/data/runpugs2.html
r14449 r14512 50 50 <div id="mainwindow"> 51 51 <h1>Run Perl 6 now -- in your browser!</h1> 52 <p>This live web terminal runs the latest development snapshot of 53 the <a href="http://www.pugscode.org">pugs</a> interpreter for <a 52 <p>This live web terminal runs the <a href="http://www.pugscode.org">pugs</a> interpreter for <a 54 53 href="http://dev.perl.org/perl 6/">Perl 6</a>. For more details, read the <a 55 54 href="http://feather.perl6.nl/~andara/runpugs/">info page</a>. 56 55 </p> 57 <form style="text-align: left" id="term" name="terminal" 58 action="/cgi-bin/runpugs2" method="POST"> 56 <p>By default, the Pugs session will use the <a 57 href="http://search.cpan.org/search?query=perl6%3A%3Apugs&mode=module">latest 58 release</a>. To use the latest development snapshot, change the setting 59 below.</p> 59 60 60 < input type="hidden" name="testing" value="_TESTING_">61 <form id="term" name="terminal" action="/cgi-bin/runpugs2" method="POST"> 61 62 <input type="hidden" name="prompt" value="_PROMPTW_"> 62 63 <input type="hidden" name="sessionid" value=""> 64 <input type="hidden" name="ia" value="1"> 63 65 <input type="hidden" name="action" value="runpugs"> 64 <!--<label for="cmd">Interactive Pugs Session<br>--> 65 <h2>Interactive Pugs Session</h2> 66 <input type="radio" id="rel" value="0" name="reldev" _REL_ ><label 67 for="rel">Release</label> 68 <input type="radio" id="dev" value="1" name="reldev" _DEV_ ><label for="dev">Development</label> 69 <br><br> 70 <span class="tabon">Interactive Pugs Session</span> 71 <a class="taboff" href="/cgi-bin/runpugs2?ia=0">Run a Perl 6 Script</a> 66 72 <div id="termwindow"> 67 <select name="history" id="hist" onChange="select_enter()"><!--onKeyPress="return 68 select_enter(this,event)">--> 73 <select name="history" id="hist" onChange="select_enter()"> 69 74 <option value="">--- Recent commands ---</option> 70 75 _HIST_ 71 76 </select> 72 77 <br> 73 <!--74 <span class="prompt">75 _PROMPTW_76 </span>77 <span class="termfont">78 _CMDW_79 </span>80 <br>81 -->82 78 <textarea readonly id="output" name="output" rows="_NROWS_" cols="80" wrap="virtual"> 83 79 _REPLYW_ -
misc/runpugs/htdocs/runpugs.css
r14449 r14512 8 8 } 9 9 H2 { font-weight: bold; font-size: 12pt} 10 LABEL {font-weight: bold; } 10 LABEL {font-weight: normal; } 11 FIELDSET {border: solid white 0px}; 12 LEGEND {font-weight:bold; text-align: center; } 11 13 .copyright {font-size: 9pt} 12 14 .warning { … … 14 16 padding: 5px; 15 17 } 18 .tabon 19 { 20 font-weight:bold; 21 background-color: #f2f2f0; 22 border: solid 2px #204a87; 23 padding: 2px; 24 padding-bottom: 0px; 25 margin-top: 10px; 26 27 } 28 .taboff { 29 font-weight:bold; 30 background-color: #c2c2c0; 31 color: gray; 32 border: solid 2px #204a87; 33 padding: 2px; 34 padding-bottom: 0px; 35 margin-top: 10px; 36 } 16 37 #mainwindow { 17 38 width: 85ex; /*750px */ 18 39 } 19 40 #hist { 20 width: 100%; /*750px; */21 font-family: "Andale Mono", courier, fixed, monospace;22 font-weight: normal;23 font-size: 10pt;24 color: #204a87;25 border: solid 0px #204a87;41 width: 100%; /*750px; */ 42 font-family: "Andale Mono", courier, fixed, monospace; 43 font-weight: normal; 44 font-size: 10pt; 45 color: #204a87; 46 border: solid 0px #204a87; 26 47 background-color: #f2f2f0; 27 48 padding-bottom: 5px; 28 49 } 50 .term { 51 background-color: #f2f2f0; 52 border: solid 2px #204a87; 53 padding: 5px; 54 } 55 #outputwindow { 56 height=20ex; 57 } 58 #editorwindow { 59 height: 50ex; /*400px;*/ 60 } 61 29 62 #termwindow { 30 63 height: 45ex; /*400px;*/ 31 64 background-color: #f2f2f0; 32 border: solid 2px #204a87;65 border: solid 2px #204a87; 33 66 padding: 5px; 34 67 } … … 36 69 font-family: "Andale Mono", courier, fixed, monospace; 37 70 font-size: 11pt; 38 font-weight: bold;71 font-weight: bold; 39 72 line-height: 12pt; 40 73 color: #204a87; … … 45 78 font-family: "Andale Mono", courier, fixed, monospace; 46 79 font-size: 11pt; 47 font-weight: normal;80 font-weight: normal; 48 81 line-height: 12pt; 49 82 color: #204a87; … … 61 94 border: solid 0px #f2f2f0; 62 95 } 63 #output {64 width: 100%;96 #output,#script { 97 width: 100%; 65 98 font-family: "Andale Mono", courier, fixed, monospace; 66 99 font-size: 11pt; … … 69 102 color: #204a87; 70 103 background-color: #f2f2f0; 71 border: solid 0px #f2f2f0;72 /* for IE */73 overflow: visible;104 border: solid 0px #f2f2f0; 105 /* for IE */ 106 overflow: visible; 74 107 } 75 108 #cmd { … … 88 121 A:visited, A.bold:visited { text-decoration: underline; color: #660066} 89 122 A:hover, A.bold:hover { text-decoration: underline; color: #000099} 90 123 A.taboff:link, A.taboff:active,A.taboff:visited {text-decoration: none; color: #333333} -
misc/runpugs/lib/Web/Terminal/Dispatcher.pm
r14449 r14512 24 24 my $id = shift; 25 25 my $ip = shift; 26 my $cmds = shift; 26 my $app=shift; 27 my $interactive=shift; 28 my $cmds = shift; 27 29 my $host = $Web::Terminal::Settings::host; 28 30 my $port = $Web::Terminal::Settings::port; … … 66 68 return "Sorry, the pugs server is not running."; 67 69 } else { 68 my $msg = YAML::Syck::Dump({ id=> $id, ip=> $ip, cmd=> $cmd});70 my $msg = YAML::Syck::Dump({ id=> $id, ip=> $ip, app=>$app,ia=>$interactive,cmd=> $cmd}); 69 71 $conn->send_now($msg); 70 72 ( my $rmesg, my $err ) = $conn->rcv_now(); -
misc/runpugs/lib/Web/Terminal/Server.pm
r14449 r14512 37 37 my $id = shift; 38 38 my $ip=shift; 39 my $app=shift; 40 my $ia=shift; 39 41 my $cmd = shift; 40 42 if(scalar(keys %terminals)>$Web::Terminal::Settings::nsessions){ # each pugs takes 1% of feather's MEM! … … 42 44 } else { 43 45 if ( exists $terminals{$id} ) { 44 print "$id exists\n";45 46 if ($terminals{$id}->{pid}) { 46 47 $terminals{$id}->{called}=time; 48 #if swap to other app 49 if ($app != $terminals{$id}->{'app'}) { 50 &killterm($id); 51 $terminals{$id} = new 52 Web::Terminal::Server::Session(app=>$app,ia=>$ia,id=>$id,cmds=>$cmd); 53 my $term = $terminals{$id}; 54 $term->{called}=time; 55 my $init= $term->{'init'}; 56 my $error= $term->{'error'}; 57 if ($error==1) { # Failed to create a new terminal 58 $sessions_per_ip{$ip}--; 59 delete $terminals{$id}; 60 } 61 return $init; 62 } 47 63 my $term = $terminals{$id}; 48 64 push @{$term->{recent}},$cmd unless $cmd=~/^\s*$/; … … 52 68 my $lines = $term->write($cmd); 53 69 if ( $cmd eq $Web::Terminal::Settings::quit_command ) { 54 my $pid= $terminals{$id}->{pid}; 55 print "Quit $id ($pid)\n"; 56 delete $terminals{$id}; 57 if ($pid) { 58 kill 9,$pid; 59 } 70 &killterm($id); 60 71 $sessions_per_ip{$ip}--; 61 72 return $lines; 62 # }63 #if ($lines=~/Aborted/s) {64 73 } elsif ($terminals{$id}->{error}==1) { 65 my $pid= $terminals{$id}->{pid}; 66 delete $terminals{$id}; 67 if ($pid) { 68 kill 9,$pid; 69 } 74 &killterm($id); 70 75 $sessions_per_ip{$ip}--; 71 76 } … … 81 86 print "New $id\n"; 82 87 $sessions_per_ip{$ip}++; 83 $terminals{$id} = new Web::Terminal::Server::Session(); 88 print "$app $ia $id $cmd\n"; 89 $terminals{$id} = new 90 Web::Terminal::Server::Session(app=>$app,ia=>$ia,id=>$id,cmds=>$cmd); 84 91 $terminals{$id}->{called}=time; 85 92 $terminals{$id}->{ip}=$ip; 86 93 my $term = $terminals{$id}; 87 my $ init= $term->{'output'};94 my $output= $term->{'output'}; 88 95 my $error= $term->{'error'}; 89 if ($error==1 ) { # Failed to create a new terminal96 if ($error==1 or $ia==0) { # Failed to create a new terminal 90 97 $sessions_per_ip{$ip}--; 91 98 delete $terminals{$id}; 92 99 } 93 return $ init;100 return $output; 94 101 } 95 102 } … … 107 114 my $ip=$mesgref->{ip}; 108 115 my $cmd=$mesgref->{cmd}; 116 my $app=$mesgref->{app}; 117 my $ia=$mesgref->{ia}; 109 118 # $cmd=pack("U0C*", unpack("C*",$cmd)); 110 119 my $pid=0; … … 115 124 print scalar(localtime)," : $nsess : $ip : $id : $pid > ",$cmd,"\n"; 116 125 print LOG2 scalar(localtime)," : $nsess : $ip : $id : $pid > ",$cmd,"\n"; 117 my $lines = &termhandler( $id, $ip, $ cmd );126 my $lines = &termhandler( $id, $ip, $app,$ia, $cmd ); 118 127 my @history=(''); # --- Recent commands ---'); 119 128 my $prompt=$Web::Terminal::Settings::prompt; … … 164 173 kill 'USR1',getppid(); 165 174 } 166 system("killall $Web::Terminal::Settings::command");175 #system("killall $Web::Terminal::Settings::commands[$app]"); 167 176 chdir $Web::Terminal::Settings::cgi_path; 168 177 exec("$Web::Terminal::Settings::perl ../bin/$Web::Terminal::Settings::server"); … … 197 206 } 198 207 } 208 sub killterm { 209 my $id=shift; 210 my $pid= $terminals{$id}->{pid}; 211 delete $terminals{$id}; 212 if ($pid) { 213 kill 9,$pid; 214 } 215 } 199 216 200 217 1; -
misc/runpugs/lib/Web/Terminal/Server/Session.pm
r14449 r14512 19 19 my $class = ref($invocant) || $invocant; 20 20 my $self = {@_}; 21 #my $prompt = '/\>\ /';22 21 my $prompt ='/'.$Web::Terminal::Settings::prompt.'/'; 23 22 $self->{'prompt'}=$prompt; 24 # my $prompt= '/'.$Web::Terminal::Settings::init_pattern.'/';25 #my $prompt= '/'.$Web::Terminal::Settings::prompt_pattern.'/';26 23 $self->{'error'}=0; 27 24 $self->{'recent'}=[]; 28 25 ## Start pugs 29 # $ENV{PUGS_SAFEMODE}=1;# Must be in CGI script! 30 ( $self->{'pty'},$self->{'pid'} ) = 31 &spawn($Web::Terminal::Settings::command); # spawn() defined below 26 my $app=$self->{'app'}; 27 my $command=$Web::Terminal::Settings::commands[$app]; 28 if ($self->{'ia'}==0) { 29 #1. Create a file with the content of $cmd using $id.p6 for name, store in data 30 my $id=$self->{'id'}; 31 open(P6,">$Web::Terminal::Settings::tmp_path/$id.p6") or ($self->{'error'}=1); 32 if($self->{'error'}==0) { 33 print P6 $self->{'cmds'}; 34 close P6; 35 $command.=" $Web::Terminal::Settings::tmp_path/$id.p6"; 36 } 37 } 38 ( $self->{'pty'},$self->{'pid'} ) = &spawn($command); # spawn() defined below 32 39 if ( $self->{'pty'}==-1 and $self->{'pid'}==0) { 33 40 $self->{'output'}= "\nThere was a problem starting pugs. Please try again later."; 34 41 $self->{'error'}=1; 42 if ($self->{'ia'}==0) { 43 my $id=$self->{'id'}; 44 unlink "$Web::Terminal::Settings::tmp_path/$id.p6"; 45 } 35 46 } else { 36 47 ## Create a Net::Telnet object to perform I/O on pugs's tty. … … 43 54 -cmd_remove_mode => 0, 44 55 ); 45 my $error='';56 # my $error=''; 46 57 # ( my $p, my $m ) = $self->{'pugs'}->waitfor( 47 58 # -match => $self->{'pugs'}->prompt, … … 55 66 bless($self,$class); 56 67 my $m=$self->readlines(); 57 #die "starting pugs failed: ", $self->{'pugs'}->lastline; 58 $self->{'output'}= $m; #$p.$m.$error;#$self->{'pugs'}->prompt; 68 if ($self->{'error'}==1) { 69 # should close the TTY 70 $self->{'pty'}->close() unless ($self->{'pty'}==-1); 71 $self->{'pugs'}->close(); 72 } 73 if ($self->{'ia'}==0) { 74 my $id=$self->{'id'}; 75 unlink "$Web::Terminal::Settings::tmp_path/$id.p6"; 76 # should close the TTY 77 $self->{'pty'}->close() unless ($self->{'pty'}==-1); 78 $self->{'pugs'}->close(); 79 } 80 $self->{'output'}= $m; 59 81 } 60 82 #bless($self,$class); … … 65 87 my $obj = shift; 66 88 my $ps = '';
