请解释以下语法:
i##*.
i%.*
Run Code Online (Sandbox Code Playgroud)
我明白它在做什么,但我想知道一般模式(为什么/如何这样做)。
它出现的代码:
#!/bin/bash
recursive_name_change()
{
cd "$1"
for i in *
do
#echo "${i##*.}"
if [ -d "$i" ]
then
recursive_name_change "$i"
elif [ "${i##*.}" = "cpp" ]
then
new_name=${i%.*}".c"
mv "$i" "$new_name"
fi
done
cd ../
}
recursive_name_change .
Run Code Online (Sandbox Code Playgroud)
有人还请建议,我可以从哪里找到这些特殊的语法形式?
我已经编写了以下小型知识库来反转给定列表,
reverse_list([],[]).
reverse_list([X|L1], [L2|X]) :-
reverse_list(L1, L2).
Run Code Online (Sandbox Code Playgroud)
当前,执行时
reverse_list([a,b,c,d], X).
Run Code Online (Sandbox Code Playgroud)
它产生,
X = [[[[[]|d]|c]|b]|a].
Run Code Online (Sandbox Code Playgroud)
解释为什么会发生将不胜感激。而且,我该如何解决这个问题?
我认为在最后一步L2变为[],在向后传播期间,它变成这样。如何X = [d,c,b,a]使用这种方法的修改来获得类似的输出。
PS:我是Prolog的新手。
在下面的 lex 代码中,我不明白尖括号 . <newstate>{DEFINITION} 语法如何工作?
%{
#include<stdio.h>
int c=0;
%}
START "/*"
END "*/"
SIMPLE [^*]
SPACE [ \t\n]
COMPLEX "*"[^/]
%s newstate
%%
"//"(.*[ \t]*.*)*[\n]+ {c++; fprintf(yyout," ");}
{START} {yymore();BEGIN newstate;}
<newstate>{SIMPLE} {yymore();BEGIN newstate;}
<newstate>{COMPLEX} {yymore();BEGIN newstate;}
<newstate>{SPACE} {yymore();BEGIN newstate;}
<newstate>{END} {c++;fprintf(yyout," ");BEGIN 0;}
%%
main()
{//program to remove comment lines
yyin=fopen("file4","r");
yyout=fopen("fileout4","w");system("cat file4");
yylex();system("cat fileout4");
printf("no.of comments=%d",c);
fclose(yyin);
fclose(yyout);
}
`
Run Code Online (Sandbox Code Playgroud)