`\makeatletter` und `\makeatother` müssen außerhalb von `\newcommand` stehen. Innerhalb von `\newcommand` sind die Catcodes schon fixiert und lassen sich nicht mehr ändern.
\begin{filecontents*}{permutationen.txt}
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
\end{filecontents*}
\documentclass{article}
\usepackage{pgfplotstable}
% Liste einlesen
\pgfplotstableread{permutationen.txt}{\Perm}
\pgfplotstablegetcolsof{\Perm}
\pgfmathsetmacro{\cols}{\pgfplotsretval-1}
\makeatletter
\DeclareRobustCommand\PermutationsListeErstellen[2]{%
% Kommaseparierte Permutationsliste erstellen:
\@ifdefinable#2{\let#2=\empty}% Liste erstellen
\foreach \i in {0,...,\cols} {%
\pgfplotstablegetelem{#1}{\i}\of{\Perm}%
\ifx\empty\PermutationsListe
\protected@xdef\PermutationsListe{\pgfplotsretval}%
\else
\protected@xdef\PermutationsListe{\PermutationsListe,\pgfplotsretval}%
\fi
}%
}
\makeatother
\begin{document}
\PermutationsListeErstellen{1}{\PermutationsListe}
\foreach \i in \PermutationsListe {
\i
}
\end{document}
[![alt text][1]][1]
Deutlich eleganter, kürzer und lesbarer geht das natürlich mit Lua. Als Bonus funktioniert hier auch die von dir gewünschte Syntax (zumindest fast).
\begin{filecontents*}{permutationen.txt}
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
\end{filecontents*}
\documentclass{article}
\usepackage{pgffor}
\usepackage{luacode}
\begin{luacode*}
local perms = {}
for line in io.lines("permutationen.txt") do
perms[#perms+1] = { string.match(line, "(%d+)%s*(%d+)%s*(%d+)") }
end
function get_perm(n)
tex.sprint(table.concat(perms[n+1],","))
end
\end{luacode*}
\newcommand\PermutationsListeErstellen[1]{\directlua{get_perm(#1)}}
\begin{document}
\foreach \i in {\PermutationsListeErstellen{1}} {
\i
}
\end{document}
[1]: https://texwelt.de/wissen/upfiles/test_407.pnghttps://texwelt.de/wissen/upfiles/test_407.png