我从聊天服务器收到的消息需要与关键字列表进行比较。我使用常规数组,但想切换到关联数组以尝试提高处理速度。
单词列表将在一个名为aWords的数组中,值将是一个'type'指示符,即aWords [该死的] =“1”,其中1是发誓词在一个图例中通知用户。
问题是我需要将每个索引值与输入$ line进行比较,以查找子字符串。我试图尽可能避免每个索引值的循环。
从http://tldp.org/LDP/abs/html/string-manipulation.html开始,我正在考虑子串删除部分。
${string#substring}
Deletes shortest match of $substring from front of $string.
'$'中'删除'字符串的比较可能会有所帮助,但它是否会与其他单词中间的单词相匹配?即匹配 this 中的关键字他的。
对于这篇冗长的帖子感到抱歉,但我试图尽我所能完成所有我想要完成的事情。
答案 0 :(得分:1)
# create a colon-separated string of the array keys
# you can do this once, after the array is created.
keys=$(IFS=:; echo "${!aWords[*]}")
if [[ ":$keys:" == *:"$word":* ]]; then
# $word is a key in the array
case ${aWords[$word]} in
1) echo "Tsk tsk: $word is a swear word" ;;
# ...
esac
fi
答案 1 :(得分:0)
这是我第一次听说bash中的关联数组。它激励我尝试添加一些东西,并且有机会让我完全忽视这一点。
这是一段代码段。我希望我明白它是如何运作的:
declare -A SWEAR #create associative array of swearwords (only once)
while read LINE
do
[ "$LINE"] && SWEAR["$LINE"]=X
done < "/path/to/swearword/file"
while :
do
OUTGOING="" #reset output "buffer"
read REST #read a sentence from stdin
while "$REST" #evaluate every word in the sentence
do
WORD=${REST%% *}
REST=${REST#* }
[ ${SWEAR[$WORD]} ] && WORD="XXXX"
OUTGOING="$OUTGOING $WORD"
done
echo "$OUTGOING" #output to stdout
done