lokale Variablen in awk

Kamikaze

Warrior of Sunlight
Staff member
Ich finde in awk keine Möglichkeit lokale Variablen, die nur in ihrer Funktion gültig sind, anzulegen. Im Moment behelfe ich mich damit die benötigten Variablen als Parameter im Funktionskopf mit anzugeben:
Code:
##
# Resolves paths at the beginning of a location pattern as
# far as possible and prints the result. This feature makes it
# easier to work with symlinks.
#
# @param	path		The location pattern to resolve.
#
function resolvePath(path,
pattern) {
	pattern = path;
	# Select the resolvable part of the given path.
	sub("[/]*[^/]*[?*].*$", "", path);
	# Remember the part that cannot be resolved.
	sub("^" path, "", pattern);

	# If there is a resolveable part do so.
	if (path) {
		# If path exists, resolve and print it, else print the
		# original string.
		print("printf `[ -d " path " ] && (cd \"" path "\";pwd -P) || printf " path "`") | "sh";
		close("sh");
	}

	# Append the unresolvable part.
	printf("%s", pattern);
}
Gibt es auch eine richtege möglichkeit pattern anzulgegen ohne das es global wird?
 
[LoN]Kamikaze said:
Ich finde in awk keine Möglichkeit lokale Variablen, die nur in ihrer Funktion gültig sind, anzulegen. Im Moment behelfe ich mich damit die benötigten Variablen als Parameter im Funktionskopf mit anzugeben:

Hast Du mal die man-page zu awk gelesen? Da steht's drin. Zugegeben, etwas undeutlich, aber es steht drin.
 
Laut "man page" machst du das genau richtig.

% uname -sr
FreeBSD 6.1-STABLE
% awk -V
awk version 20050424 (FreeBSD)
% man awk | grep -A2 -B2 local

Parameters are passed by value if scalar and by reference if array
name; functions may be called recursively. Parameters are local to the
function; all other variables are global. Thus local variables may be
created by providing excess parameters in the function definition.


ein kleiner test verrät, dass das sogar klappt! :)

function f( param, lvar )
{
dummy="local dummy"
lvar="local variable"

printf( "--> context: local\n" )
printf( "dummy= %s\ngvar= %s\nlvar= %s\nparam= %s\n\n", dummy, gvar, lvar, param )
}

BEGIN {
dummy="global dummy"
gvar="global variable"

printf( "--> context: global\n" )
printf( "dummy= %s\ngvar= %s\nlvar= %s\nparam= %s\n\n", dummy, gvar, lvar, param )

f( "some value" )

printf( "--> context: global\n" )
printf( "dummy= %s\ngvar= %s\nlvar= %s\nparam= %s\n\n", dummy, gvar, lvar, param )
}


HTH, Gruß W.
 
Nunja, unvernünftig ist die Lösung ja nicht ... sie scheint Dir nur nicht richtig zu gefallen ;)
 
Back
Top