\\server\dir string darabolás perlben

sziasztok!

van valami egyszerű mód arra, hogyha egy változóban levő (pl. $uncpath="\\server\source\dir\file") útvonalat akarom kettévágni úgy, hogy kb ez legyen a végeredmény:

$p1="\\server\"
$p2="\source\dir\file"

korábban olvastam valami olyan split szerű eszközről, ami úgy vág, hogy n darab előfordulás után a "maradék" az utsó darabban van akkor is, ha lenne még benne szerparáló tag. hm... lehet nehéz így érteni, de kb olyanra gondolok, hogy kiindulva:

$uncpath="\\server\dir\to\file";
($p1,p2)=darabolgató(/\/);

magyarul az első \ után már nem nézi mi van tovább, rakja szépen be a p2-be. rosszul emlékszem, hogy volt valami ilyen util? jó lenne, ha nem kéne erre (nem mintha nagy kaland lenne) csinálni sub-ot. persze, ha nem megy másképp, akkor megcsinálom, de nem találom azt, amivel eleve meg lehet csinálni ezt...

Hozzászólások

en split -et hasznalnek, szepen arrayba beramolja a darbokat


$uncpath = "\\server\source\dir\file"

@outputarray = split(/\\+/, $uncpath);

# \\ - escape karakter kell a backslashnek
# + a ket szeparator kozotti ures mezot figyelmen kivul hagyja

@outputarray = ("server", "source", "dir", "file");

ezzel az lehet a baj, hogy csak a server és a file tagok "egyértelműek". de ha az útvonal több részből áll, akkor bukhat. nem akartam "terelni a gondolatot" előre, ezért csak most írom le én mivel csinálom most (csak kényelmetlen). az index és az rindex eljárásokkal vágok. úgy ahogy megcsinálható ami kell, de randa kicsit és nem tudom, hogy "átbújhat-e rajta" valami úgy, hogy nem ellenőrzöm...

--
xterm

nem ertem ez miert nem eleg - lesz egy array-ed, aminek az elso tagja a server, az utolso tagja a file. Sot mitobb a masodik tagja a tombnek a source-t fogja tartalmazni.
azaz


$outputarray[0]="server"
$outputarray[1]="source"

$outputarray[-1]="file"

#ami kozte van meg path to

akar ki is shift(); elheted a server nevet az arraybol kulon es akkor tenyeleg ugy fog kinezni ahogy szeretned


$uncpath=/^(..[^\\]+)(\\.+)$/;
$p1=$1.'\\';
$p2=$2;

Nem túl szép, de működő. A regex első csoportja lesz a bevezető két karakter (két backslash, de minek vizsgálni :), utána addig, amíg nem backslash. A végén a backslash már nem lesz része, ezért kell utólag mögé fűzni (bár nem tudom, miért van rá szükséged. A második csoport a maradék, az elején a backslashsel.

Szerintem egyszerűbb az index():


$i=index($uncpath,'\\',2);
$p1=substr($uncpath,0,$i+1);
$p2=substr($uncpath,$i);

Aztán lehet kedvenc módomon :)


($p1,$p2)=split(/(?<=[^\\])\\)/,$uncpath,2);
$p1.='\\';
$p2="\\$p2";

Itt a lényeg, hogy a regex az első két backslashre nem illeszkedik, mert az első előtt nincs karakter, a második előtt pedig backslash van.
Ebben az a szép, hogy nincs plusz egy változó, mint az előbb, és nem kell az egész stringen végigmennie, mint az elsőben.