2011-09-07 74 views
1

我工作的一個非常簡單的腳本,讀maplist.txt文件,並使用\ n分隔映射名稱中它來構建一個命令字符串 - 不過,我得到一些意想不到的行爲。用Perl字符串連接怪異的行爲

我全碼:

# compiles a map pack from maplist.txt 
# for every server. 
# Filipe Dobreira <[email protected]> 
# v1 @ Sept. 2011 

use strict; 
my @servers = <*>; 
foreach my $server (@servers) 
{ 
     # we only want folders: 
     next if -f $server; 
     print "server: $server\n"; 

     my $maplist = $server . '/orangebox/cstrike/maplist.txt'; 
     my $mapdir = $server . '/orangebox/cstrike/maps'; 

     print " maplist: $maplist\n"; 
     print " map folder: $mapdir\n"; 

     # check if the maplist actually exists: 
     if(!(-e $maplist)) 
     { 
       print "!!! failed to find $maplist\n"; 
       next; 
     } 

     open MAPLIST, "<$maplist"; 
     foreach my $map (<MAPLIST>) 
     { 
       chomp($map); 
       next if !$map; 

       # full path to the map file: 
       my $mapfile = "$mapdir/$map.bsp"; 
       print "$mapfile\n"; 
     } 
} 

當我宣佈$mapfile,我希望得到的結果是這樣的:

zombieescape1/orangebox/cstrike/maps/ze_stargate_escape_v8.bsp 

然而,這似乎是串聯正在以開始製作字符串,並且最終結果變成類似於:

.bspiescape1/orangebox/cstrike/maps/ze_stargate_escape_v8 

因此,.bsp部分實際上是在最左邊的字符串的起始處寫入的。我的perl體驗非常少,我只能假設這是我無法理解一些怪癖或操作員行爲。

注意:我也試過使用"${mapdir}/${map}.bsp",用點運算符和join "", $mapdir, $map, ".bsp"連接所有東西,結果相同。

在此先感謝。

PS:供參考,這裏有一個maplist.txt的樣子:

zm_3dubka_v3 
zm_4way_tunnel_v2 
zm_abstractchode_pyramid2 
zm_anotheruglyzmap_v1e 
zm_app7e_betterbworld_JDfix_v3 
zm_atix_helicopter_mini 
zm_base_winter_beta3 
zm_battleforce_panic_ua 
zm_black_lion_macd_v8 
zm_bunker_f57_v2 
zm_burbsdelchode_b3 
zm_choddarena_b12 
zm_choddasnowpanic_b4 
zm_citylife_V2b 
zm_crazycity 
zm_deep_thought_nv 
zm_desert_fortress_v2 
ZM_desprerados_a1 
zm_doomlike_station_v2 
zm_dust_arena_v1_final 
zm_exhibit_night_2F 
zm_facility_v1 
zm_farm3_nav72 
zm_firewall_samarkand 
zm_fortress_b7 
zm_ghs_flats 
zm_gl33m4x_errata 
zm_idm_hauntedhouse_v1 
zm_industry_v2 
zm_kruma_kakariko_village_006 
zm_kruma_panic_004 
zm_lila_off!ce_v4 
zm_little_city_v5pf_fix 
zm_moonlight_v3_pF 
zm_moon_roflicious_pF_02 
zm_moocbblechode_b2 
zm_mountain_b2 
zm_neko_abura_v2 
zm_neko_athletic_park_v2 
zm_novum_v3_JDfix 
zm_ocx_orly_v4 
zm_officeattack_b5a 
zm_officerush_betav7 
zm_officesspace_pfss 
zm_omi_facility_pfv2 
zm_penumbra_PF3 
zm_raindance_ak_v2 
zm_roflicious_pfcf2 
zm_roy_abandoned_canals_new 
zm_roy_barricade_factory 
zm_roy_highway 
zm_roy_industrial_complex 
zm_roy_old_industrial_pF 
zm_roy_the_ship_pf 
zm_roy_zombieranch_night_b4 
zm_survival_f2a 
zm_temple_v3pf 
zm_towers_v3 
zm_tx_highschool_zkedit_v2 
zm_unpanicv2_pF 
zm_vc2_office_redone_b1 
zm_wasteyard_beta3 
zm_winterfun_b4a 
zm_wtfhax_v6 
zm_wtfhax_v6e 
zm_wwt_twinsteel_v8 
+0

你在使用這個操作系統? – ennuikiller

+0

@ennuikiller:Linux版本2.6.39-pf2(...)(gcc版本4.4.5(Gentoo 4.4.5 p1.2,pie-0.4.5))(...) – Filipe

+0

我還沒有能力重現你的問題,需要嘗試幾件事:打開一個新的xterm並運行它,有時xterm上的設置會被破壞;有可能你有兩個相同的進程運行兩次?確保您已啓用自動刷新$ | = 1 – ennuikiller

回答

6

我猜的maplist.txt具有非Unix行結尾的 - 可能是dos - 作爲結果你看到了什麼樣子預謀。

的問題是,所述格格()只消耗兩個結束字符中的一個,而使回車後面。

您可能會發現,如果您在打開地圖列表之前設置(輸入記錄分隔符),那麼chomp會執行該作業 - 它將消耗兩個行尾字符。

$/ = qq{\r\n}; 

另一種解決方案是將行結束轉換處理之前的文件中,可能使用dos2unix

+0

賓果!我想有人在Windows上編輯過這個文件,或者經過了一些Filezilla的怪異之處。非常感謝! – Filipe

+4

@Filipe,與martin clayton的解決方案不同,'open MAPLIST「,<:crlf」,$ maplist;'可以以CRLF或LF結束,也可以使用'$ map =〜s/\ s + \ z //;'而不是'chomp($ map);'。我推薦後者。 – ikegami