Fil*_*ipe 1 perl string-concatenation
我正在编写一个非常简单的脚本,读取maplist.txt文件并使用\n分隔的地图名称来构建命令字符串 - 但是,我遇到了一些意想不到的行为.
我的完整代码:
# compiles a map pack from maplist.txt
# for every server.
# Filipe Dobreira <dobreira@gmail.com>
# 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";
}
}
Run Code Online (Sandbox Code Playgroud)
在我声明的地方$mapfile
,我希望结果如下:
zombieescape1/orangebox/cstrike/maps/ze_stargate_escape_v8.bsp
Run Code Online (Sandbox Code Playgroud)
但是,看起来字符串的START是串联的,最终的结果是:
.bspiescape1/orangebox/cstrike/maps/ze_stargate_escape_v8
Run Code Online (Sandbox Code Playgroud)
因此,该.bsp
部分实际上是在最左边的字符串的开头写的.我的perl经验非常少,我只能假设这是我无法理解某些怪癖或操作员行为.
注意:我也尝试过使用"${mapdir}/${map}.bsp"
dot运算符和a连接所有内容,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
Run Code Online (Sandbox Code Playgroud)
我猜它maplist.txt
有非unix行结尾 - 可能是dos - 结果你看到看起来像前置.
问题是chomp()只消耗两个行结束字符中的一个,留下回车符.
您可能会发现,如果在打开地图列表之前设置了Perl特殊变量 $/
(输入记录分隔符),则该chomp会执行该作业 - 它将消耗两个行结束字符.
$/ = qq{\r\n};
Run Code Online (Sandbox Code Playgroud)
另一个解决方案是在处理之前转换文件中的行结尾,也许使用dos2unix.
归档时间: |
|
查看次数: |
974 次 |
最近记录: |