2012-03-18 15 views
5

Chcę korzystać z niektórych linii perla, tak:

perl -pe "$_=~s///e" 

Problemem jest to, bash wciąż rozszerzając "$ _" zmienną. Mogłabym umieścić wyrażenie perla w pojedynczym cudzysłowie, ale to uniemożliwiłoby mi dodanie niektórych zmiennych do skryptu.

Czy istnieje bash przystankowy z rozszerzeniem zmiennej "$ _"?

+2

Uwaga bliżej: nie bądź niedorzeczny. Pytania dotyczące programowania Shell absolutnie należą do stackoverflow. – tchrist

+1

Nie potrzebujesz *, aby użyć tamtej zmiennej '$ _'. – TLP

+0

@TLP - to był tylko przykład. W prawdziwym skrypcie naprawdę potrzebowałem tego. :) – Rogach

Odpowiedz

11
perl -pe '$_=~s///e' 

lub

perl -pe "\$_=~s///e" 
1

mix-and-match.

perl -pe '$_=~s///e; echo "'"$idontknowperl"'"' 

Dopóki przytoczone sekcje będą leżały naprzeciw siebie, będą traktowane jako jeden argument.

+3

No tak, ale kompilator Perla nie będzie zadowolony, że wywołałeś metodę/funkcję 'echo'. :) – tchrist

5

Po pierwsze: wiesz, że możesz użyć $ENV{myvariable}, aby uzyskać dostęp do zmiennych środowiskowych, prawda? I nie musisz określać $_ podczas korzystania z m//, s/// i tr///?

Ponadto, jeśli chcesz przekazać zmienne do perla, istnieją inne sposoby robienia tego poza próbą interpolacji zmiennych powłoki do twojego kodu perla.

perl -we 'my ($var1, $var2, $var3) = @ARGV;' "$MYFOO" "$BAR" "$baz" 

Jeśli zmienne powłoki nie zawierają białych znaków, można zrezygnować z cytowania.

Teraz, jeśli chcesz użyć przełączników -p lub -n, są również sposoby obejścia tego.

perl -pwe 'BEGIN { my $var1 = shift; my $var2 = shift } #code goes here' 
    "$MYFOO" "$BAR" file1 file2 

Korzystanie shift w oświadczeniu BEGIN usunie zmienne z @ARGV tak, że nie są one wykorzystywane przez niejawny while pętli -p i -n przełączników.

+1

'ENV' w perlu jest specyficzne dla zmiennych środowiskowych, a nie ogólnie zmiennych powłoki. –

Powiązane problemy