2011-09-07 3 views
1

아주 간단한 스크립트에서 maplist.txt 파일을 읽고 \ n 분리 된 맵 이름을 사용하여 명령 문자열을 작성하고 있습니다. 그러나 예기치 않은 동작이 나타납니다. .Perl 문자열 연결에 이상한 동작

내 전체 코드 :

내가 $mapfile를 선언
# 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"; 
     } 
} 

, 내가 기대했던 결과는 무엇인가 : 병합이의 START에 만들어지고있는 것처럼 그러나

zombieescape1/orangebox/cstrike/maps/ze_stargate_escape_v8.bsp 

것 같습니다 문자열 및 최종 결과는 다음과 같이됩니다.

.bspiescape1/orangebox/cstrike/maps/ze_stargate_escape_v8 

따라서 .bsp 부분은 실제로 맨 왼쪽 문자열 시작 부분에 쓰여지고 있습니다. 나는 약간의 perl 경험을 가지고 있으며, 나는 이것이 단지 몇 가지 기발한 또는 조작자의 행동을 이해하지 못한다고 가정 할 수있다.

참고 : 도트 연산자로 모든 것을 연결하고 join "", $mapdir, $map, ".bsp" 같은 결과를 사용하여 "${mapdir}/${map}.bsp"을 사용해 보았습니다.

미리 감사드립니다.

추신 : 참조를 위해, 여기에 같은 maplist.txt 보이는 내용은 다음과 같습니다 - 아마 도스 - 나는 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

실행중인 OS는 무엇입니까? – ennuikiller

+0

@ennuikiller : 리눅스 버전 2.6.39-pf2 (...) (gcc 버전 4.4.5 (Gentoo 4.4.5 p1.2, 파이 -0.4.5)) (...) – Filipe

+0

나는 할 수 없었다. 문제를 재현하기 위해 몇 가지 시도해보십시오. 새로운 xterm을 열고 실행하십시오. 때때로 xterm의 설정이 엉망이됩니다. 동일한 프로세스가 2 번 실행될 가능성이 있습니까? 자동 플러시가 $ | 켜져 있는지 확인하십시오. = 1 – ennuikiller

답변

6

과 결과로 당신은 어떻게 생겼는지 prepending.

문제는 chomp()가 줄 바꿈 문자 두 개 중 하나만 사용하여 캐리지 리턴을 남기는 것입니다.

지도 목록을 열기 전에 Perl special variable$/ (입력 레코드 분리 자)를 설정하면 그 chomp가 작업을 수행합니다. 두 줄의 끝 문자는 모두 소모됩니다.

$/ = qq{\r\n}; 

또 다른 해결책은 아마도 dos2unix를 사용하여 처리하기 전에 파일의 라인 엔딩을 변환하는 것입니다.

+0

빙고! 누군가 Windows에서 파일을 편집했거나 Filezilla의 별난 일을 겪었습니다. 정말 고맙습니다! – Filipe

+4

@Filipe, martin clayton의 솔루션과 달리,'open MAPLIST, "<: crlf", $ maplist;는''$ map = ~ s/\ s + \ z '를 사용하여 CRLF 또는 LF로 라인 끝을 처리 할 것이다. // chomp ($ map); 대신';'; 나는 후자를 추천한다. – ikegami