Nima uchun PowerShell (Perl bilan) oddiy chop etish bayonotida qo'sh tirnoqlarni olib tashlaydi?

Men uzoq vaqtdan beri Linux foydalanuvchisiman, lekin Windows va PowerShell uchun yangiman. Men Windows7 va Strawberry Perl 5 ni birinchi marta o'rnatdim. Endi men Windows PowerShell yordamida oddiy buyruq qatorini chop qilmoqchiman.

Perl to'g'ri o'rnatilganga o'xshaydi:

PS C:\Users\Me> perl -v 
This is perl, v5.10.0 built for MSWin32-x86-multi-thread Copyright
1987-2007, Larry Wall 
...

Va buyruq qatori ishlari ishlaydi:

PS C:\Users\Me> perl -e 'die'
Died at -e line 1.

PS C:\Users\Me> echo 'print "Hello, World\n"' | perl
Hello, World

Lekin men buni o'z-o'zidan sinab ko'rganimda, u fayl boshqaruvchisi ogohlantirishini chiqaradi:

PS C:\Users\Me> perl -e 'print "Hello, World\n"'
No comma allowed after filehandle at -e line 1.

Shunday qilib, u qo'sh tirnoqlarni olib tashlaganga o'xshaydi.

PS C:\Users\Me> perl -e 'print \"Hello, World\n\"'
Hello, World

Bu ishlaydi, lekin bu yomon! Qayta urinib ko'raylik:

PS C:\Users\Me> perl -e 'print qq{Hello, World\n}'
Hello, World

Bu ko'proq o'xshaydi, lekin men chalkashib ketdim.

Nima uchun PowerShell bitta tirnoq ichidagi qo'sh tirnoqlardan qochyapti? Har qanday PowerShell foydalanuvchisi bormi?


person CoffeeMonster    schedule 08.08.2009    source manba
comment
perl -e "print 'Hello, World'" ni sinab ko'rdingizmi?   -  person Weegee    schedule 11.08.2009


Javoblar (3)


Menimcha, bu erda bir nechta muammo bor. Ulardan biri shundaki, tirnoqlar powershell va Perl da ramziy ma'noga ega. Kotirovkalar va qochish UNIX qobig'iga qaraganda powershellda biroz boshqacha ishlaydi. Powershell-da man about_quoting-ni tekshiring.

Ikkinchi muammo shundaki, perl buyruq qatori Windows davrida boshqacha harakat qiladi. Perl-ga o'tmoqchi bo'lgan buyruq satri ichidagi har qanday qo'sh qo'shtirnoq, perl termini bilan \" sifatida chiqarilishi kerak. Bu powershell-ga xos emas. Bu Perl Windows-da ishlaydi. Sizda odatda shunga o'xshash muammolar bo'ladi. cmd.exe.

Ushbu versiyalar ishlashi kerak:

PS> & perl -e "print \`"hello, world\n\`""
hello, world
PS> $s = "print \`"hello, world\n\`""
PS> echo $s
print \"hello, world\n\"
PS> & perl -e $s
hello, world

Xuddi shu narsani bitta tirnoq yordamida kamroq qochish bilan qilishingiz mumkin.

PS> & perl -e 'print \"hello, world\n\"'
hello, world
PS> $s = 'print \"hello, world\n\"'
PS> echo $s
print \"hello, world\n\"
PS> & perl -e $s
hello, world

Tahlil qilish uchun Perl-ga yangi qatordan qochish ketma-ketligini o'tkazish o'rniga, yangi qatorni powershell-ga qo'yishingiz mumkin.

PS> & perl -e "print \`"hello, world`n\`""
hello, world
PS> $s = "print \`"hello, world`n\`""
PS> echo $s
print \"hello, world
\"
PS> & perl -e $s
hello, world
person Brian Reiter    schedule 11.08.2009

Qiziqarli. Powershell dunyosini tark etganingizda, u Windows buyruqlar qobig'i tomonidan to'g'ri talqin qilinishi uchun bitta tirnoqni qo'sh tirnoqga aylantiradi. (Yoki shunga o'xshash narsa). Python bilan ko'rsatish uchun (bu xuddi shu muammoni ko'rsatadigan ko'rinadi):

PS C:\> python -c  'print "Hi from python"'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'Hi' is not defined

Windows buyruqlar qobig'idan shunga o'xshash biror narsa qilishga harakat qilsam, xuddi shu xato:

C:\>python -c  "print "Hi from python""
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'Hi' is not defined

Bu buyruqni bajarishda powershell buni amalga oshirayotganga o'xshaydi:

PS C:\> $s = 'python -c "print "Hi from python""'
PS C:\> cmd /c $s
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'Hi' is not defined
person zdan    schedule 09.08.2009

PowerShell o'rniga cmd.exe da "noto'g'ri" buyrug'ini ishlatsangiz nima bo'ladi? Men so'rayman, chunki ishlaydigan qochish ketma-ketligi (\") Perl; PowerShell'da u ``"` bo'ladi.

person dahlbyk    schedule 09.08.2009