題目:
給定多條shell腳本,求最後一條shell中變量的完整值。其中每條腳本中“=”左側爲變量名,等號右側中以“${”和“}”包圍起來的是需要替換的變量名,例如
tencent=qq${wx}
wx=weixin
則tencent=qqweixin
輸入示例:
4
x=root/${y}/host
y=net
z=tomcat
last=/home/${x}/local/${z}/com
輸出示例:
/home/root/net/host/local/tomcat/com
規定:
①不存在交叉引用,即不會出現類似下列情況:
x=${y}
y=${x}
②可能存在某變量的引用變量在該條腳本後面出現,如:
x=${y}
y=z
③除輸入第一行爲表示腳本行數的數字外,其餘均爲字符串。
解題思路
思路:遞歸。首先讀取輸入,將除最後一行的腳本之外的腳本以dict形式存儲,構建遞歸函數,處理最後一行腳本。
import sys
in_list = []
for line in sys.stdin:
sh_cnt = int(line.split()[0])
if sh_cnt!=0:
for i in range(sh_cnt):#存儲
sh_item = input()
sh_item = sh_item.split()[0]
in_list.append(sh_item)#字符串
break
else:
break
back_str_list = in_list[:-1]#除去最後一個
out_str_org = in_list[-1]#最後一行
back_str_dict = dict()#將所有變量以dict形式存儲
#定義字符串轉dict函數
def str_2_dict(in_list, in_dict):
for in_list_i in in_list:
split_list = in_list_i.split('=')#分拆
in_dict[split_list[0]] = split_list[1]#存進dict
str_2_dict(back_str_list, back_str_dict)
#定義遞歸函數
def digui_process(in_str, in_dict):
out_str = in_str
if "${" in out_str and "}" in out_str:
#查找變量位置
cnt = out_str.count("${")
for cnt_i in range(cnt):
front = out_str.find("${")
tmp_str = out_str#使用tmp_str而不是直接使用out_str確保front索引有效
out_str = tmp_str[:front]#截取待替換前字符串保存到out_str
rest_str = tmp_str[front+2:]
end = rest_str.find("}")
if end!=-1:#存在配對
bianliang_str = rest_str[:end]
bianliang_value = in_dict[bianliang_str]
out_str += digui_process(bianliang_value, in_dict)
out_str+=rest_str[end+1:]
else:
out_str+=rest_str#不存在配對則直接合並
# return out_str
# else:#如果不存在需要替換的變量
# return in_str
return out_str#以上三行合併成此條return
split_index = out_str_org.find('=')#去掉最後一行腳本的變量名和“=”,按格式輸出
print(digui_process(out_str_org, back_str_dict)[split_index+1:])
輸入輸出: