[29197] in Perl-Users-Digest
Perl-Users Digest, Issue: 441 Volume: 11
daemon@ATHENA.MIT.EDU (Perl-Users Digest)
Thu May 17 03:10:16 2007
Date: Thu, 17 May 2007 00:09:05 -0700 (PDT)
From: Perl-Users Digest <Perl-Users-Request@ruby.OCE.ORST.EDU>
To: Perl-Users@ruby.OCE.ORST.EDU (Perl-Users Digest)
Perl-Users Digest Thu, 17 May 2007 Volume: 11 Number: 441
Today's topics:
Re: Correlating Data from same .csv, line by line gskallur@gmail.com
encoding problem on Tk entry widget <filippo2991@virgilio.it>
Modifying $_ in "map", with an array containing a gap.. <gypark@gmail.com>
new CPAN modules on Thu May 17 2007 (Randal Schwartz)
Re: Parsing a text file line-by-line: skipping badly-fo denis.papathanasiou@gmail.com
Read the text from an Application Window <jismagic@gmail.com>
regular expressions? <find.ivan@gmail.com>
Re: Script to compare two directory structures <usenet@sta.samsung.com>
Re: Simple Regular Expression Help (Jens Thoms Toerring)
Re: Simple Regular Expression Help (Greg Bacon)
Re: Simple Regular Expression Help <wahab-mail@gmx.de>
Re: Simple Regular Expression Help usenet@DavidFilmer.com
Re: Store Object Class in DBM Hash <paduille.4061.mumia.w+nospam@earthlink.net>
Storing Object in DBM Hash michael.shnitzer@gmail.com
Re: Storing Object in DBM Hash michael.shnitzer@gmail.com
Test harness for scripts? <bwooster47@gmail.com>
Digest Administrivia (Last modified: 6 Apr 01) (Perl-Users-Digest Admin)
----------------------------------------------------------------------
Date: 16 May 2007 21:47:15 -0700
From: gskallur@gmail.com
Subject: Re: Correlating Data from same .csv, line by line
Message-Id: <1179377235.521173.133580@y80g2000hsf.googlegroups.com>
saved from url=(0022)http://internet.e-mail -->
<!-- saved from url=(0022)http://internet.e-mail -->
<!-- saved from url=(0022)http://internet.e-mail -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html;
charset=windows-1252">
<META content="Microsoft FrontPage 4.0" name=GENERATOR></HEAD>
<BODY>
<SCRIPT language=JavaScript>
dCol='FF3399';//date colour.
fCol='8833FF';//face colour.
sCol='FF0000';//seconds colour.
mCol='00FF00';//minutes colour.
hCol='0000FF';//hours colour.
nCol='3388ff';//New Year '8833FF' nice color
//greann 22CC44
nCol1='3388ff';
nCol2='3388ff';
nCol3='3388ff';
nCol4='3388ff';
nCol5='3388ff';
nCol6='ff8080';
nCol7='3388ff';
nCol8='3388ff';
ClockHeight=40;
ClockWidth=40;
ClockFromMouseY=0;
ClockFromMouseX=100;
//Alter nothing below! Alignments will be lost!
d=new Array("SUNDAY","MONDAY","TUESDAY","JYOTHI
CREATOR","THURSDAY","FRIDAY","SATURDAY");
m=new
Array("JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER");
date=new Date();
day=date.getDate();
year=date.getYear();
if (year < 2000) year=year+1900;
TodaysDate=" "+d[date.getDay()]+" "+day+" "+m[date.getMonth()]+"
"+year;
D=TodaysDate.split('');
H='.......';
H=H.split('');
M='........';
M=M.split('');
S='.........';
S=S.split('');
Face='1 2 3 4 5 6 7 8 9 10 11 12';
font='Arial';
New= '. . . F R I E N D S H I P . . . . ';
New1=' L O V E . . L O V E . L O V E . .';
New2=' W E A L T H . . W E A L T H . .';
New3=' H A P P I N E S S . H A P P I N E S S .';
New4=' S U C C E S S . . S U C C E S S . .';
New5=' K N O W L E D G E . K N O W L E D G E .';
New6=' H E A L T H . . H E A L T H . .';
New7=' F A M I L Y . . F A M I L Y . . ';
New8=' H O N E S T Y . H O N E S T Y . ';
size=1;
speed=0.6;
ns=(document.layers);
ie=(document.all);
Face=Face.split(' ');
n=Face.length;
New=New.split(' ');
ny=New.length;
New1=New1.split(' ');
ny1=New1.length;
New2=New2.split(' ');
ny2=New2.length;
New3=New3.split(' ');
ny3=New3.length;
New4=New4.split(' ');
ny4=New4.length;
New5=New5.split(' ');
ny5=New5.length;
New6=New6.split(' ');
ny6=New6.length;
New7=New7.split(' ');
ny7=New7.length;
New8=New8.split(' ');
ny8=New8.length;
a=size*10;
ymouse=0;
xmouse=0;
scrll=0;
props="<font face="+font+" size="+size+" color="+fCol+"><B>";
nprops="<font face="+font+" size="+size+" color="+nCol+"><B>";
nprops11="<font face="+font+" size="+size+" color="+nCol1+"><B>";
nprops22="<font face="+font+" size="+size+" color="+nCol2+"><B>";
nprops33="<font face="+font+" size="+size+" color="+nCol3+"><B>";
nprops44="<font face="+font+" size="+size+" color="+nCol4+"><B>";
nprops55="<font face="+font+" size="+size+" color="+nCol5+"><B>";
nprops66="<font face="+font+" size="+size+" color="+nCol6+"><B>";
nprops77="<font face="+font+" size="+size+" color="+nCol7+"><B>";
nprops88="<font face="+font+" size="+size+" color="+nCol8+"><B>";
props2="<font face="+font+" size="+size+" color="+dCol+"><B>";
Split=360/n;
Dsplit=360/D.length;
HandHeight=ClockHeight/4.5
HandWidth=ClockWidth/4.5
HandY=-7;
HandX=-2.5;
scrll=0;
step=0.06;
currStep=0;
y=new Array();x=new Array();Y=new Array();X=new Array();
for (i=0; i < n; i++){y[i]=0;x[i]=0;Y[i]=0;X[i]=0}
Dy=new Array();Dx=new Array();DY=new Array();DX=new Array();
for (i=0; i < D.length; i++){Dy[i]=0;Dx[i]=0;DY[i]=0;DX[i]=0}
if (ns){
for (i=0; i < D.length; i++)
document.write('<layer name="nsDate'+i+'" top=0 left=0 height='+a+'
width='+a+'><center>'+props2+D[i]+'</font></center></layer>');
for (i=0; i < n; i++)
document.write('<layer name="nsFace'+i+'" top=0 left=0 height='+a+'
width='+a+'><center>'+props+Face[i]+'</font></center></layer>');
for (i=0; i < ny; i++)
document.write('<layer name="nsNew'+i+'" top=0 left=0 height='+a+'
width='+a+'><center>'+nprops+New[i]+'</font></center></layer>');
for (i=0; i < ny1; i++)
document.write('<layer name="nsNew1'+i+'" top=0 left=0 height='+a+'
width='+a+'><center>'+nprops11+New1[i]+'</font></center></layer>');
for (i=0; i < ny2; i++)
document.write('<layer name="nsNew2'+i+'" top=0 left=0 height='+a+'
width='+a+'><center>'+nprops22+New2[i]+'</font></center></layer>');
for (i=0; i < ny3; i++)
document.write('<layer name="nsNew3'+i+'" top=0 left=0 height='+a+'
width='+a+'><center>'+nprops33+New3[i]+'</font></center></layer>');
for (i=0; i < ny4; i++)
document.write('<layer name="nsNew4'+i+'" top=0 left=0 height='+a+'
width='+a+'><center>'+nprops44+New4[i]+'</font></center></layer>');
for (i=0; i < ny5; i++)
document.write('<layer name="nsNew5'+i+'" top=0 left=0 height='+a+'
width='+a+'><center>'+nprops55+New5[i]+'</font></center></layer>');
for (i=0; i < ny6; i++)
document.write('<layer name="nsNew6'+i+'" top=0 left=0 height='+a+'
width='+a+'><center>'+nprops66+New6[i]+'</font></center></layer>');
for (i=0; i < ny7; i++)
document.write('<layer name="nsNew7'+i+'" top=0 left=0 height='+a+'
width='+a+'><center>'+nprops77+New7[i]+'</font></center></layer>');
for (i=0; i < ny8; i++)
document.write('<layer name="nsNew8'+i+'" top=0 left=0 height='+a+'
width='+a+'><center>'+nprops88+New8[i]+'</font></center></layer>');
for (i=0; i < S.length; i++)
document.write('<layer name=nsSeconds'+i+' top=0 left=0 width=15
height=15><font face=Arial size=3 color='+sCol+'><center><b>'+S[i]+'</
b></center></font></layer>');
for (i=0; i < M.length; i++)
document.write('<layer name=nsMinutes'+i+' top=0 left=0 width=15
height=15><font face=Arial size=3 color='+mCol+'><center><b>'+M[i]+'</
b></center></font></layer>');
for (i=0; i < H.length; i++)
document.write('<layer name=nsHours'+i+' top=0 left=0 width=15
height=15><font face=Arial size=3 color='+hCol+'><center><b>'+H[i]+'</
b></center></font></layer>');
}
if (ie){
document.write('<div id="Od" style="position:absolute;top:0px;left:
0px"><div style="position:relative">');
for (i=0; i < D.length; i++)
document.write('<div id="ieDate" style="position:absolute;top:0px;left:
0;height:'+a+';width:'+a+';text-align:center">'+props2+D[i]+'</B></
font></div>');
document.write('</div></div>');
document.write('<div id="Of" style="position:absolute;top:0px;left:
0px"><div style="position:relative">');
for (i=0; i < n; i++)
document.write('<div id="ieFace" style="position:absolute;top:0px;left:
0;height:'+a+';width:'+a+';text-align:center">'+props+Face[i]+'</B></
font></div>');
document.write('</div></div>');
document.write('<div id="On" style="position:absolute;top:0px;left:
0px"><div style="position:relative">');
for (i=0; i < ny; i++)
document.write('<div id="ieNew" style="position:absolute;top:0px;left:
0;height:'+a+';width:'+a+';text-align:center">'+nprops+New[i]+'</B></
font></div>');
document.write('</div></div>');
document.write('<div id="On1" style="position:absolute;top:0px;left:
0px"><div style="position:relative">');
for (i=0; i < ny1; i++)
document.write('<div id="ieNew1" style="position:absolute;top:0px;left:
0;height:'+a+';width:'+a+';text-align:center">'+nprops11+New1[i]+'</
B></font></div>');
document.write('</div></div>');
document.write('<div id="On2" style="position:absolute;top:0px;left:
0px"><div style="position:relative">');
for (i=0; i < ny2; i++)
document.write('<div id="ieNew2" style="position:absolute;top:0px;left:
0;height:'+a+';width:'+a+';text-align:center">'+nprops22+New2[i]+'</
B></font></div>');
document.write('</div></div>');
document.write('<div id="On3" style="position:absolute;top:0px;left:
0px"><div style="position:relative">');
for (i=0; i < ny3; i++)
document.write('<div id="ieNew3" style="position:absolute;top:0px;left:
0;height:'+a+';width:'+a+';text-align:center">'+nprops33+New3[i]+'</
B></font></div>');
document.write('</div></div>');
document.write('<div id="On4" style="position:absolute;top:0px;left:
0px"><div style="position:relative">');
for (i=0; i < ny4; i++)
document.write('<div id="ieNew4" style="position:absolute;top:0px;left:
0;height:'+a+';width:'+a+';text-align:center">'+nprops44+New4[i]+'</
B></font></div>');
document.write('</div></div>');
document.write('<div id="On5" style="position:absolute;top:0px;left:
0px"><div style="position:relative">');
for (i=0; i < ny5; i++)
document.write('<div id="ieNew5" style="position:absolute;top:0px;left:
0;height:'+a+';width:'+a+';text-align:center">'+nprops55+New5[i]+'</
B></font></div>');
document.write('</div></div>');
document.write('<div id="On6" style="position:absolute;top:0px;left:
0px"><div style="position:relative">');
for (i=0; i < ny6; i++)
document.write('<div id="ieNew6" style="position:absolute;top:0px;left:
0;height:'+a+';width:'+a+';text-align:center">'+nprops66+New6[i]+'</
font></div>');
document.write('</div></div>');
document.write('<div id="On7" style="position:absolute;top:0px;left:
0px"><div style="position:relative">');
for (i=0; i < ny7; i++)
document.write('<div id="ieNew7" style="position:absolute;top:0px;left:
0;height:'+a+';width:'+a+';text-align:center">'+nprops77+New7[i]+'</
B></font></div>');
document.write('</div></div>');
document.write('<div id="On8" style="position:absolute;top:0px;left:
0px"><div style="position:relative">');
for (i=0; i < ny8; i++)
document.write('<div id="ieNew8" style="position:absolute;top:0px;left:
0;height:'+a+';width:'+a+';text-align:center">'+nprops88+New8[i]+'</
B></font></div>');
document.write('</div></div>');
document.write('<div id="Oh" style="position:absolute;top:0px;left:
0px"><div style="position:relative">');
for (i=0; i < H.length; i++)
document.write('<div id="ieHours" style="position:absolute;width:
16px;height:16px;font-family:Arial;font-size:16px;color:'+hCol+';text-
align:center;font-weight:bold">'+H[i]+'</div>');
document.write('</div></div>');
document.write('<div id="Om" style="position:absolute;top:0px;left:
0px"><div style="position:relative">');
for (i=0; i < M.length; i++)
document.write('<div id="ieMinutes" style="position:absolute;width:
16px;height:16px;font-family:Arial;font-size:16px;color:'+mCol+';text-
align:center;font-weight:bold">'+M[i]+'</div>');
document.write('</div></div>')
document.write('<div id="Os" style="position:absolute;top:0px;left:
0px"><div style="position:relative">');
for (i=0; i < S.length; i++)
document.write('<div id="ieSeconds" style="position:absolute;width:
16px;height:16px;font-family:Arial;font-size:16px;color:'+sCol+';text-
align:center;font-weight:bold">'+S[i]+'</div>');
document.write('</div></div>')
}
(ns)?window.captureEvents(Event.MOUSEMOVE):0;
function Mouse(evnt){
ymouse = (ns)?evnt.pageY+ClockFromMouseY-(window.pageYOffset):event.y
+ClockFromMouseY;
xmouse = (ns)?evnt.pageX+ClockFromMouseX:event.x+ClockFromMouseX;
}
(ns)?window.onMouseMove=Mouse:document.onmousemove=Mouse;
function ClockAndAssign(){
time = new Date ();
secs = time.getSeconds();
sec = -1.57 + Math.PI * secs/30;
mins = time.getMinutes();
min = -1.57 + Math.PI * mins/30;
hr = time.getHours();
hrs = -1.575 + Math.PI * hr/6+Math.PI*parseInt(time.getMinutes())/360;
if (ie){
Od.style.top=window.document.body.scrollTop;
Of.style.top=window.document.body.scrollTop;
On.style.top=window.document.body.scrollTop;
On1.style.top=window.document.body.scrollTop;
On2.style.top=window.document.body.scrollTop;
On3.style.top=window.document.body.scrollTop;
On4.style.top=window.document.body.scrollTop;
On5.style.top=window.document.body.scrollTop;
On6.style.top=window.document.body.scrollTop;
On7.style.top=window.document.body.scrollTop;
On8.style.top=window.document.body.scrollTop;
Oh.style.top=window.document.body.scrollTop;
Om.style.top=window.document.body.scrollTop;
Os.style.top=window.document.body.scrollTop;
}
for (i=0; i < n; i++){
var F=(ns)?document.layers['nsFace'+i]:ieFace[i].style;
F.top=y[i] + ClockHeight*2*Math.sin(-1.0471 + i*Split*Math.PI/
180)+scrll;
F.left=x[i] + ClockWidth*2*Math.cos(-1.0471 + i*Split*Math.PI/180);
}
//for (i=0; i < ny; i++){
// var N=(ns)?document.layers['nsNew'+i]:ieNew[i].style;
// N.top=y[i] + ClockHeight*3.5*Math.sin(-1.0471 + i*Split*Math.PI/
180)+scrll;
// N.left=x[i] + ClockWidth*3.5*Math.cos(-1.0471 + i*Split*Math.PI/
180);
// }
for (i=0; i < H.length; i++){
var HL=(ns)?document.layers['nsHours'+i]:ieHours[i].style;
HL.top=y[i]+HandY+(i*HandHeight)*Math.sin(hrs)+scrll;
HL.left=x[i]+HandX+(i*HandWidth)*Math.cos(hrs);
}
for (i=0; i < M.length; i++){
var ML=(ns)?document.layers['nsMinutes'+i]:ieMinutes[i].style;
ML.top=y[i]+HandY+(i*HandHeight)*Math.sin(min)+scrll;
ML.left=x[i]+HandX+(i*HandWidth)*Math.cos(min);
}
for (i=0; i < S.length; i++){
var SL=(ns)?document.layers['nsSeconds'+i]:ieSeconds[i].style;
SL.top=y[i]+HandY+(i*HandHeight)*Math.sin(sec)+scrll;
SL.left=x[i]+HandX+(i*HandWidth)*Math.cos(sec);
}
for (i=0; i < D.length; i++){
var DL=(ns)?document.layers['nsDate'+i]:ieDate[i].style;
DL.top=Dy[i] + ClockHeight*2.5*Math.sin(currStep+i*Dsplit*Math.PI/
180)+scrll;
DL.left=Dx[i] + ClockWidth*2.5*Math.cos(currStep+i*Dsplit*Math.PI/
180);
}
for (i=0; i < ny; i++){
var NY=(ns)?document.layers['nsNew'+i]:ieNew[i].style;
NY.top=120+Dy[i] + ClockHeight*1.2*Math.sin(currStep+i*Dsplit*Math.PI/
180)+scrll;
NY.left=140+Dx[i] + ClockWidth*1.2*Math.cos(currStep+i*Dsplit*Math.PI/
180);
}
for (i=0; i < ny1; i++){
var NY1=(ns)?document.layers['nsNew1'+i]:ieNew1[i].style;
NY1.top=120+Dy[i] + ClockHeight*1.2*Math.sin(currStep
+i*Dsplit*Math.PI/180)+scrll;
NY1.left=Dx[i] + ClockWidth*1.2*Math.cos(currStep+i*Dsplit*Math.PI/
180)-140;
}
for (i=0; i < ny2; i++){
var NY2=(ns)?document.layers['nsNew2'+i]:ieNew2[i].style;
NY2.top=150+Dy[i] + ClockHeight*1.2*Math.sin(currStep
+i*Dsplit*Math.PI/180)+scrll;
NY2.left=Dx[i] + ClockWidth*1.2*Math.cos(currStep+i*Dsplit*Math.PI/
180);
}
for (i=0; i < ny3; i++){
var NY3=(ns)?document.layers['nsNew3'+i]:ieNew3[i].style;
NY3.top=Dy[i] + ClockHeight*1.2*Math.sin(currStep+i*Dsplit*Math.PI/
180)+scrll-120;
NY3.left=140+Dx[i] + ClockWidth*1.2*Math.cos(currStep
+i*Dsplit*Math.PI/180);
}
for (i=0; i < ny4; i++){
var NY4=(ns)?document.layers['nsNew4'+i]:ieNew4[i].style;
NY4.top=Dy[i] + ClockHeight*1.2*Math.sin(currStep+i*Dsplit*Math.PI/
180)+scrll-120;
NY4.left=Dx[i] + ClockWidth*1.2*Math.cos(currStep+i*Dsplit*Math.PI/
180)-140;
}
for (i=0; i < ny5; i++){
var NY5=(ns)?document.layers['nsNew5'+i]:ieNew5[i].style;
NY5.top=Dy[i] + ClockHeight*1.2*Math.sin(currStep+i*Dsplit*Math.PI/
180)+scrll-150;
NY5.left=Dx[i] + ClockWidth*1.2*Math.cos(currStep+i*Dsplit*Math.PI/
180);
}
for (i=0; i < ny6; i++){
var NY6=(ns)?document.layers['nsNew6'+i]:ieNew6[i].style;
NY6.top=200+Dy[i] + ClockHeight*2.0*Math.sin(currStep
+i*Dsplit*Math.PI/180)+scrll;
NY6.left=220+Dx[i] + ClockWidth*2.0*Math.cos(currStep
+i*Dsplit*Math.PI/180);
}
for (i=0; i < ny7; i++){
var NY7=(ns)?document.layers['nsNew7'+i]:ieNew7[i].style;
NY7.top=Dy[i] + ClockHeight*1.2*Math.sin(currStep+i*Dsplit*Math.PI/
180)+scrll;
NY7.left=160+Dx[i] + ClockWidth*1.2*Math.cos(currStep
+i*Dsplit*Math.PI/180);
}
for (i=0; i < ny8; i++){
var NY8=(ns)?document.layers['nsNew8'+i]:ieNew8[i].style;
NY8.top=Dy[i] + ClockHeight*1.2*Math.sin(currStep+i*Dsplit*Math.PI/
180)+scrll;
NY8.left=Dx[i] + ClockWidth*1.2*Math.cos(currStep+i*Dsplit*Math.PI/
180)-160;
}
currStep-=step;
}
function Delay(){
scrll=(ns)?window.pageYOffset:0;
Dy[0]=Math.round(DY[0]+=((ymouse)-DY[0])*speed);
Dx[0]=Math.round(DX[0]+=((xmouse)-DX[0])*speed);
for (i=1; i < D.length; i++){
Dy[i]=Math.round(DY[i]+=(Dy[i-1]-DY[i])*speed);
Dx[i]=Math.round(DX[i]+=(Dx[i-1]-DX[i])*speed);
}
y[0]=Math.round(Y[0]+=((ymouse)-Y[0])*speed);
x[0]=Math.round(X[0]+=((xmouse)-X[0])*speed);
for (i=1; i < n; i++){
y[i]=Math.round(Y[i]+=(y[i-1]-Y[i])*speed);
x[i]=Math.round(X[i]+=(x[i-1]-X[i])*speed);
}
ClockAndAssign();
setTimeout('Delay()',20);
}
if (ns||ie)window.onload=Delay;
</SCRIPT>
<BR><BR><BR><BR><BR><BR><BR><BR><BR>
<FONT color=blue>
<!--How amazing is this?</FONT size=20 Color=red><BR>I do not know who
wrote this HTML code but it's quite spectacular (don't forget to move
your mouse and see what happens).<br>Merv Chivers :o)-->
</BODY></HTML>
------------------------------
Date: 16 May 2007 23:41:02 -0700
From: filippo <filippo2991@virgilio.it>
Subject: encoding problem on Tk entry widget
Message-Id: <1179384062.608394.165020@q23g2000hsg.googlegroups.com>
I have a strange problem, probably due to encoding:
my database tables (postgresql) have Latin9 encoding and stores
italian names (a e i o u with accent). I can retrieve these names and
load into entry widgets but if I copy-back these into database (from
entry widgets just loaded), these letters change to strange not-ascii
char.
I would not be a database problem because if I print to video the sql
insert strings, these contains the altready corrupted words.
How can I solve this problem?
Thanks,
Filippo
------------------------------
Date: 16 May 2007 23:42:07 -0700
From: Raymundo <gypark@gmail.com>
Subject: Modifying $_ in "map", with an array containing a gap...
Message-Id: <1179384127.288782.323080@w5g2000hsg.googlegroups.com>
Hello,
I'm sorry I'm not good at English. :-)
foreach and map functions show the same result when an array has no
gap.
@array = (1, 2, 3, 4);
foreach (@array) {
$_ *= 10
}
# now, $array = (10, 20, 30, 40)
@array = (1, 2, 3, 4);
map { $_ *= 10 } @array;
# now, $array = (10, 20, 30, 40)
However, if an array contains a gap...
1 $array1[0] = 0;
2 $array1[9] = 9; # now $array1 = (0, undef,
undef, ... , 9);
3 print "@array1", "\n"; # 0 "" "" ... "" 9
4 foreach (@array1) {
5 $_ *= 10 # $array1 = (0, 0, 0, ... , 90)
6 }
7 print "@array1", "\n"; # 0 0 0 ... 0 90
8
9
10 $array2[0] = 0;
11 $array2[9] = 9;
12 print "@array2", "\n"; # 0 "" "" ... "" 9
13 map { $_ *= 10 } @array2; # ERROR!!!!!!
14 print "@array2", "\n";
line 1-7 work well, but using map, line 13 reports an error:
Modification of a read-only value attempted at t2.pl line 13.
Before line 13, line 12 prints the intervening elements, treating
undef as null string. Then why does line 13 make such error? Is it a
bug? or...?
------------------------------
Date: Thu, 17 May 2007 04:42:09 GMT
From: merlyn@stonehenge.com (Randal Schwartz)
Subject: new CPAN modules on Thu May 17 2007
Message-Id: <JI6529.14wx@zorch.sf-bay.org>
The following modules have recently been added to or updated in the
Comprehensive Perl Archive Network (CPAN). You can install them using the
instructions in the 'perlmodinstall' page included with your Perl
distribution.
Asterisk-Store-Queue-0.1
http://search.cpan.org/~goozbach/Asterisk-Store-Queue-0.1/
Class for Asterisk queue objects
----
Asterisk-Store-Queue-Member-0.1
http://search.cpan.org/~goozbach/Asterisk-Store-Queue-Member-0.1/
Class for Asterisk queue member objects
----
Bio-Das-ProServer-2.6
http://search.cpan.org/~rpettett/Bio-Das-ProServer-2.6/
----
Brick-0.225_02
http://search.cpan.org/~bdfoy/Brick-0.225_02/
Complex business rule data validation
----
Bundle-OpenXPKI-0.02
http://search.cpan.org/~alech/Bundle-OpenXPKI-0.02/
A bundle to install modules required for OpenXPKI
----
Coro-3.63
http://search.cpan.org/~mlehmann/Coro-3.63/
coroutine process abstraction
----
Data-Serializer-0.40
http://search.cpan.org/~neely/Data-Serializer-0.40/
Modules that serialize data structures
----
Data-Validate-Domain-0.06
http://search.cpan.org/~neely/Data-Validate-Domain-0.06/
domain validation methods
----
Data-Validate-IP-0.06
http://search.cpan.org/~neely/Data-Validate-IP-0.06/
ip validation methods
----
Egg-Plugin-SessionKit-Auth-2.01
http://search.cpan.org/~lushe/Egg-Plugin-SessionKit-Auth-2.01/
Authentication of session base.
----
Egg-Release-2.06
http://search.cpan.org/~lushe/Egg-Release-2.06/
Version of Egg WEB Application Framework.
----
ExtUtils-F77-1.16
http://search.cpan.org/~kgb/ExtUtils-F77-1.16/
Simple interface to F77 libs
----
Hook-Filter-0.03
http://search.cpan.org/~erwan/Hook-Filter-0.03/
A runtime filtering layer on top of subroutine calls
----
Imager-0.58
http://search.cpan.org/~tonyc/Imager-0.58/
Perl extension for Generating 24 bit Images
----
Mail-DKIM-0.25
http://search.cpan.org/~jaslong/Mail-DKIM-0.25/
Signs/verifies Internet mail with DKIM/DomainKey signatures
----
Module-List-Pluggable-0.02
http://search.cpan.org/~doom/Module-List-Pluggable-0.02/
list or require sub-sets of modules
----
Net-Domain-ExpireDate-0.41
http://search.cpan.org/~despair/Net-Domain-ExpireDate-0.41/
obtain expiration date of domain names
----
Net-Telnet-Brcd-0.17
http://search.cpan.org/~lbendavid/Net-Telnet-Brcd-0.17/
Perl libraries to contact Brocade switch
----
Net-Whois-Raw-1.22
http://search.cpan.org/~despair/Net-Whois-Raw-1.22/
Get Whois information for domains
----
PGPLOT-2.20
http://search.cpan.org/~kgb/PGPLOT-2.20/
allow subroutines in the PGPLOT graphics library to be called from Perl.
----
RTx-Calendar-0.04
http://search.cpan.org/~nchuche/RTx-Calendar-0.04/
Calendar for RT due tasks
----
Sort-Key-IPv4-0.01
http://search.cpan.org/~salva/Sort-Key-IPv4-0.01/
sort IPv4 addresses
----
Term-Menus-1.20
http://search.cpan.org/~reedfish/Term-Menus-1.20/
Create Powerful Terminal, Console and CMD Enviroment Menus
----
Tie-Handle-CSV-0.08
http://search.cpan.org/~danboo/Tie-Handle-CSV-0.08/
easy access to CSV files
----
WWW-Mechanize-1.26
http://search.cpan.org/~petdance/WWW-Mechanize-1.26/
Handy web browsing in a Perl object
----
WWW-Nike-NikePlus-0.01
http://search.cpan.org/~alexlomas/WWW-Nike-NikePlus-0.01/
----
WebService-Timelog-0.01
http://search.cpan.org/~kentaro/WebService-Timelog-0.01/
A Perl interface to Timelog API
----
WebService-Timelog-0.02
http://search.cpan.org/~kentaro/WebService-Timelog-0.02/
A Perl interface to Timelog API
----
Win32-0.28_01
http://search.cpan.org/~jdb/Win32-0.28_01/
Interfaces to some Win32 API Functions
----
Win32-HostExplorer
http://search.cpan.org/~geokevhat/Win32-HostExplorer/
Automate telnet using Hummingbird HostExplorer and interact with the presentation space.
----
Win32-HostExplorer-01
http://search.cpan.org/~geokevhat/Win32-HostExplorer-01/
Automate telnet using Hummingbird HostExplorer and interact with the presentation space.
----
Win32-IIS-Admin-1.018
http://search.cpan.org/~mthurn/Win32-IIS-Admin-1.018/
Administer Internet Information Service on Windows
----
Win32-Uptime-1.01
http://search.cpan.org/~stro/Win32-Uptime-1.01/
Calculate uptime for Win32 systems
----
XML-Grammar-Screenplay-0.01
http://search.cpan.org/~shlomif/XML-Grammar-Screenplay-0.01/
module implementing an XML grammar for screenplays.
----
YAML-Tiny-1.08
http://search.cpan.org/~adamk/YAML-Tiny-1.08/
Read/Write YAML files with as little code as possible
----
parrot-0.4.12
http://search.cpan.org/~chromatic/parrot-0.4.12/
----
pler-0.18
http://search.cpan.org/~adamk/pler-0.18/
The DWIM Perl Debugger
----
re-engine-PCR-0.01_01
http://search.cpan.org/~avar/re-engine-PCR-0.01_01/
Pugs::Compiler::Rule regex engine
----
re-engine-Plugin-0.02
http://search.cpan.org/~avar/re-engine-Plugin-0.02/
API to write custom regex engines
If you're an author of one of these modules, please submit a detailed
announcement to comp.lang.perl.announce, and we'll pass it along.
This message was generated by a Perl program described in my Linux
Magazine column, which can be found on-line (along with more than
200 other freely available past column articles) at
http://www.stonehenge.com/merlyn/LinuxMag/col82.html
print "Just another Perl hacker," # the original
--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
------------------------------
Date: 16 May 2007 19:05:50 -0700
From: denis.papathanasiou@gmail.com
Subject: Re: Parsing a text file line-by-line: skipping badly-formed lines?
Message-Id: <1179367550.489281.104770@k79g2000hse.googlegroups.com>
> But what about the records that aren't properly terminated? Won't
> that throw off your count?
If the read fails, the exception handling returns null for the entire
array of n bytes.
Likewise, if the read succeeds, the array is valid, i.e. all lines
within the data block are of the same size (and the routine that picks
out lines from the array does further checking).
So it brings up a trade-off in sizing the array for reads: too large
and miss parts of the file uncorrupted (but traverse the file quickly)
versus too small and take forever to traverse the file (but minimize
losing uncorrupted data).
It's not perfect, and I'll keep thinking up possible improvements over
time (fortunately, it's not a problem which happens very often).
> You might try something along the following lines:
>
> #! /usr/bin/perl
>
> use strict;
> use warnings;
>
> use Fcntl qw/ SEEK_SET /;
>
> my $RECORDSZ = 20;
>
> my $IN_FILE = $0;
>
> open IN, "<:raw", $IN_FILE or die "$0: open: $!";
>
> my $nrec = 0;
> while (sysseek IN, $nrec * $RECORDSZ, SEEK_SET) {
> my $nread = sysread IN, my($buf), $RECORDSZ;
>
> if (defined $nread) {
> if ($nread == 0) {
> exit 0; # eof
> }
> else {
> $buf =~ s{([^[:graph:] ])} {
> "<" . sprintf("%02X", ord $1) . ">"
> }ge;
>
> print "$nrec: $buf\n";
> }
> }
> else {
> warn "$0: $IN_FILE:$nrec: sysread: $!";
> }
>
> ++$nrec;
> }
>
> die "$0: sysseek: $!";
>
Thanks for suggesting it; I'll definitely give it a try tomorrow.
My first (quick) impression is that the while loop should not be tied
to the file handler b/c of how perl (seems) to close or invalidate the
file handler at the sign of i/o trouble.
So it might be better to read the byte size of the file with stat(),
and use that value to iterate (read) n bytes at a time (that's what I
do in CL).
The other potential problem is catching exceptions when reading the
the corrupted section; I think "eval{ }; warn;" is supposed to do that
in perl, but I've not had success in getting it to work like an
exception handler in CL.
So regardless of how I wind up iterating through the file, if I can't
handle the bad read and maintain control, it won't work.
But that's just a guess based on a quick read; I'll experiment with it
and find out what really happens.
------------------------------
Date: 16 May 2007 11:31:39 -0700
From: jis <jismagic@gmail.com>
Subject: Read the text from an Application Window
Message-Id: <1179340299.650597.319310@o5g2000hsb.googlegroups.com>
I have an application window.I wan to read every available text in
that window.
For eg. I have a few command buttons in an application.Can i read the
text written on the button.
Is that possible through win32::ctrlgui/win32::setupsup or any other
belonging to this group
regards,
jis
------------------------------
Date: 16 May 2007 18:53:45 -0700
From: Ivan <find.ivan@gmail.com>
Subject: regular expressions?
Message-Id: <1179366825.508734.27680@w5g2000hsg.googlegroups.com>
Hi all..
I'm in need of some help..
I'm looking after a subversion machine with many repositories and many
users in the passwd files for each..
Currently when I want to get rid of one of the users, I normally have
to go through each repository, look in the passwd file and delete the
user manually..
I'm assuming with perl I might be able to make up a quick script that
will look inside each repo, find the line with the user, delete it and
save the file.. It will save a lot of my time..
Either a perl script or a shell script might be suitable for this..
All I got at the moment is the command line: grep -l "troppd" */conf/
passwd
So instead of going through hundreds of repositories, I only have to
go into the ones where "troppd" appears and I can delete it..
Would someone be able to give me an idea of what such script would
look like?
Either that, or tell me whether it's very hard to write or not ..
I've not done perl in many years so I don't even know where to start..
------------------------------
Date: 16 May 2007 11:29:58 -0700
From: Generic Usenet Account <usenet@sta.samsung.com>
Subject: Re: Script to compare two directory structures
Message-Id: <1179340198.649197.315070@u30g2000hsc.googlegroups.com>
On May 11, 10:14 am, Ed Morton <mor...@lsupcaemnt.com> wrote:
> Generic Usenet Account wrote:
> > We had a need tocomparetwodirectorystructuresto see if they are
> > identical (meaning if they have the same structure, same contents and
> > same versions of files). I wrote a shellscriptfor this purpose
> > (posted to the comp.sources.d newsgroup). It works, but given my
> > scant knowledge of scripting, it is rather crude. I am looking for
> > something more professional and robust, perhaps using perl. Any help
> > would be appreciated.
>
> > Thanks,
> > Bhta
>
> diff -r dir1 dir2
>
> If that doesn't work for you, explain why.
>
> Ed.
There is at least one situation where my extremely crude script works,
but diff -r dir1 dir2 does not. For example, the script will work
even if the two directory structures are not visible on the same
system e.g. one directory is on the build server while another
directory is on the test server, and there is no cross mounting
between the two.
Bhta
------------------------------
Date: 16 May 2007 18:14:40 GMT
From: jt@toerring.de (Jens Thoms Toerring)
Subject: Re: Simple Regular Expression Help
Message-Id: <5b100gF2qr5q2U1@mid.uni-berlin.de>
vunet.us@gmail.com wrote:
> How can I strip this line with regular expession to get 12345 number
> within brackets:
> $line = "some text is here (12345 ms)";
> This did not work:
> $text = $line;
> $text =~ m/\((\d+)\)/;
No, beacuse the number isn't immediately followed by a closing
parenthesis but there's " ms" in between. If you always have
" ms" after the numbr just change your regexp to
$text =~ /\((\d+) ms\)/;
otherwise, if you want to accept arbitrary text after the number
(excluding the closing parenthesis), use
$text =~ /\((\d+)[^)]*\)/;
Regards. Jens
--
\ Jens Thoms Toerring ___ jt@toerring.de
\__________________________ http://toerring.de
------------------------------
Date: Wed, 16 May 2007 18:17:06 -0000
From: gbacon@hiwaay.net (Greg Bacon)
Subject: Re: Simple Regular Expression Help
Message-Id: <134mil2nqolju10@corp.supernews.com>
In article <1179337861.793364.184800@e65g2000hsc.googlegroups.com>,
<vunet.us@gmail.com> wrote:
: How can I strip this line with regular expession to get 12345 number
: within brackets:
:
: $line = "some text is here (12345 ms)";
:
: This did not work:
:
: $text = $line;
: $text =~ m/\((\d+)\)/;
Try
if ($line =~ /\((\d+)[^)]+\)/) {
print "\$1 = '$1'\n";
}
else {
print "No match.\n";
}
Hope this helps,
Greg
--
As against a Jesus, the historic choice of the mass-man goes regularly
to some Barabbas.
-- Albert Jay Nock on democracy
------------------------------
Date: Wed, 16 May 2007 21:28:59 +0200
From: Mirco Wahab <wahab-mail@gmx.de>
Subject: Re: Simple Regular Expression Help
Message-Id: <f2fptk$260$1@mlucom4.urz.uni-halle.de>
vunet.us@gmail.com wrote:
> How can I strip this line with regular expession to
> get 12345 number within brackets:
>
> $line = "some text is here (12345 ms)";
>
> This did not work:
>
> $text = $line;
> $text =~ m/\((\d+)\)/;
There are some misconceptions,
$text =~ /\((\d+)\)/;
This expression (m is superfluous here)
evaluates in "scalar context", so the (unused)
"return value" is the number of hits (would be
1 in this case if the regex is correct).
If you say BRACKET '(' NUMBER (\d+) BRACKET ')',
the Regex engine thinks you mean it, so if
there is something between NUMBER and BRACKET,
your expression would not match. Better catch
such cases by an expression like:
$text =~ /\( \D* (\d+) \D* \)/x
\D* means 'no number thingy', zero or more times,
/x means 'use formatting' and ignore whitespace
in Regex.
You could do several things now:
- 'in place' replacement of the whole bracket (...)
thing by the number it contains (in $1)
$text =~ s/\( \D* (\d+) \D* \)/$1/x;
which will result in: some text is here 12345
note the s/ (substitution)
- *extract* the number but don't care about the text
my @number = $text =~ /\( \D* (\d+) \D* \)/x;
after this, the array @number has one element: 1234
(here, the expression is evaluated in list context,
returning the matches then)
Of course, there are more variants, but to give
you a start, this should suffice.
Regards
Mirco
------------------------------
Date: 16 May 2007 16:12:53 -0700
From: usenet@DavidFilmer.com
Subject: Re: Simple Regular Expression Help
Message-Id: <1179357173.094681.62690@h2g2000hsg.googlegroups.com>
On May 16, 10:51 am, vunet...@gmail.com wrote:
> $line = "some text is here (12345 ms)";
>
> This did not work:
>
> $text = $line;
> $text =~ m/\((\d+)\)/;
You are telling Perl to match an open paren, followed by one or more
digits, followed by a close paren. but your string doesn't fit that
criteria (it has digits followed by a whitespace and two alphas).
You could do something like this (and consolidate the command), which
will (greedily) match everything after the digits up to the (last)
closing paren in your input string:
my ($numbers) = ($line =~ /\((\d+).*\)/);
--
The best way to get a good answer is to ask a good question.
David Filmer (http://DavidFilmer.com)
------------------------------
Date: Wed, 16 May 2007 20:29:49 GMT
From: "Mumia W." <paduille.4061.mumia.w+nospam@earthlink.net>
Subject: Re: Store Object Class in DBM Hash
Message-Id: <1RJ2i.10499$Ut6.9674@newsread1.news.pas.earthlink.net>
On 05/16/2007 11:41 AM, michael.shnitzer@gmail.com wrote:
> It was my understanding that once a DBM hash was tied to a file, it
> can be accessed using the same methods as a regular hash. For
> simplicities sake I created a small perl program to demonstrate what I
> am trying to do:
>
> ***********************************
> #! /usr/bin/perl -w
> use warnings;
>
> my %hash = ( );
> dbmopen(%hash, ".data/documents", 0777);
> $hash{mike} = new Document;
>
> print $hash{mike}->docno;
>
> package Document;
>
> sub new
> {
> my $self = {
> document_number => "DOC123",
> };
> bless $self;
> }
>
> sub docno
> {
> my $self = shift;
> return $self->{document_number};
> }
> **************************************
>
> If I run this program with the DBM hash it returns "Can't locate
> object method "docno" via package "Document=HASH(0x4001d0cc)" (perhaps
> you forgot to load "Document=HASH(0x4001d0cc)"?) at read.pl line 11."
>
> But if I run this program without opening the DBM hash, then the
> program returns the expected result of DOC123.
>
> Obviously there is a difference in accessing the hash data when it is
> being read from a DBM hash that I am missing.
>
> Any suggestions would be appreciated.
>
> Thanks,
>
> --Mike
>
A couple of limitations in Perl and dbmopen expose the fact that
DBM-hashes are not real hashes; to store objects in a DBM, you'd
probably have to Serialize the data. You can either serialize it
yourself, or you can let MLDBM serialize it for you:
#!/usr/bin/perl
use strict;
use warnings;
my $use_mldbm = 1;
if (! $use_mldbm)
{
use Storable qw(freeze thaw);
my $file = 'dfiles/documents';
my %hash;
dbmopen %hash, $file, 0644 or die("Oops: $!");
my $obj = Document->new;
$obj->increment_docno;
$obj->increment_docno;
$obj->increment_docno;
$obj->increment_docno;
$hash{mike} = freeze($obj);
print thaw($hash{mike})->docno, "\n"; # prints "DOC127"
dbmclose %hash;
exit;
}
if ($use_mldbm)
{
use MLDBM qw(DB_File Storable);
my $file = 'dfiles/docs.db';
my %hash;
tie %hash, 'MLDBM', $file;
my $obj = Document->new;
$obj->increment_docno;
$obj->increment_docno;
$obj->increment_docno;
$obj->increment_docno;
$hash{mike} = $obj;
print $hash{mike}->docno, "\n";
untie %hash;
exit;
}
package Document;
sub new
{
my $self = {
document_number => "DOC123",
};
bless $self;
}
sub docno
{
my $self = shift;
return $self->{document_number};
}
sub increment_docno {
my $self = shift;
$self->{document_number} =~ s/(\d+)$/$1 + 1/e;
$self->{document_number};
}
__END__
Be sure to read the admonition in the BUGS section of MLDBM's pod; it
indirectly applies to dbmopen also.
------------------------------
Date: 16 May 2007 11:25:31 -0700
From: michael.shnitzer@gmail.com
Subject: Storing Object in DBM Hash
Message-Id: <1179339931.749542.148300@p77g2000hsh.googlegroups.com>
Why would the following code work in a regular hash environment but
dereference when using a DBM hash?
"Can't locate object method "docno" via package
"Document=HASH(0x4001d0cc)" (perhaps you forgot to load
"Document=HASH(0x4001d0cc)"?) at read.pl line 6."
#! /usr/bin/perl -w
use strict;
dbmopen(my %hash, "db", 0777);
$hash{mike} = new Document;
print $hash{mike}->docno;
package Document;
sub new
{
my $self = {
document_number => "DOC123",
};
bless $self;
}
sub docno
{
my $self = shift;
return $self->{document_number};
}
------------------------------
Date: 16 May 2007 17:48:31 -0700
From: michael.shnitzer@gmail.com
Subject: Re: Storing Object in DBM Hash
Message-Id: <1179362911.576873.132970@e65g2000hsc.googlegroups.com>
On May 16, 2:25 pm, michael.shnit...@gmail.com wrote:
<snip>
Sorry for the double post.
------------------------------
Date: 16 May 2007 12:47:49 -0700
From: "bwooster47@gmail.com" <bwooster47@gmail.com>
Subject: Test harness for scripts?
Message-Id: <1179344869.181841.195250@o5g2000hsb.googlegroups.com>
When creating Perl modules, there is Test::More and similar tools
available to automate the testing.
Are there general guidelines for writing test scripts that work with
the Test::Harness framework?
I noticed Test::Script - it offers one function -
"script_compiles_ok()"
But if I need more - what are some good practices for testing the full
script:
1) run script with --arg1 --arg2, check that STDOUT has a line with
"text line 1"
2) run script with --arg3 file, check that file was created (and then
clean up - remove it)
3) run script with --arg4, check that Unknown Arg error is thrown
One option is just to write the perl code to execute the above
commands, and do the checks. But how to run the command - "make test"
puts the script in blib/script, the script itself is in bin/, and
there may be a system installed old script version, so need to make
sure that the test is running the script from the development folder.
Any suggestions?
------------------------------
Date: 6 Apr 2001 21:33:47 GMT (Last modified)
From: Perl-Users-Request@ruby.oce.orst.edu (Perl-Users-Digest Admin)
Subject: Digest Administrivia (Last modified: 6 Apr 01)
Message-Id: <null>
Administrivia:
#The Perl-Users Digest is a retransmission of the USENET newsgroup
#comp.lang.perl.misc. For subscription or unsubscription requests, send
#the single line:
#
# subscribe perl-users
#or:
# unsubscribe perl-users
#
#to almanac@ruby.oce.orst.edu.
NOTE: due to the current flood of worm email banging on ruby, the smtp
server on ruby has been shut off until further notice.
To submit articles to comp.lang.perl.announce, send your article to
clpa@perl.com.
#To request back copies (available for a week or so), send your request
#to almanac@ruby.oce.orst.edu with the command "send perl-users x.y",
#where x is the volume number and y is the issue number.
#For other requests pertaining to the digest, send mail to
#perl-users-request@ruby.oce.orst.edu. Do not waste your time or mine
#sending perl questions to the -request address, I don't have time to
#answer them even if I did know the answer.
------------------------------
End of Perl-Users Digest V11 Issue 441
**************************************