Perl的system
函数允许一个间接对象。在这种情况下,
间接对象是要运行的程序,允许argv[0]
被
与可执行文件的名称不同。
所以我可以做
system {"echo"} qw(echo foo);
但是,当我使用autodie
时:
use autodie qw(:all);
system {"echo"} qw(echo foo);
我明白了
syntax error at - line 2, near "} qw(echo foo)"
为什么会这样?
答案 0 :(得分:4)
将
Module App gradle File: dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support:animated-vector-drawable:26.1.0' implementation 'com.android.support:support-v4:26.0.1' implementation 'com.android.volley:volley:1.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support:support-annotations:26.1.0' implementation 'com.android.support:recyclerview-v7:26.1.0' implementation 'com.android.support:design:26.1.0' implementation 'com.android.support:cardview-v7:26.1.0' implementation 'com.squareup.picasso:picasso:2.5.2' implementation 'com.github.bumptech.glide:glide:3.7.0' implementation project(':lib') testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso- core:3.0.1' implementation 'com.google.android.gms:play-services-base:16.1.0' implementation 'com.google.android.gms:play-services-location:16.0.0' implementation 'com.google.android.gms:play-services-ads:17.2.0' implementation 'com.patrickpissurno:ripple-effect:1.3.1' implementation 'com.google.firebase:firebase-core:16.0.8' implementation 'com.google.firebase:firebase-messaging:17.5.0' } apply plugin: 'com.google.gms.google-services' Project Gradle File: dependencies { classpath 'com.android.tools.build:gradle:3.3.0' classpath 'com.google.gms:google-services:4.0.1' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' }
应用于autodie
或system
会导致奇异形式exec
或system { $cmd } @args
被视为语法错误,直到词法范围结束。如果确实需要使用奇异形式,则可以调用exec { $cmd } @args
或CORE::system
来代替,或者在调用奇异形式之前使用CORE::exec
。
您所看到的完全是记录在案的内容。
答案 1 :(得分:4)
system
运算符具有三种语法。
system LIST
system $SCALAR LIST
system BLOCK LIST
(与间接方法调用或对象完全无关。)
autodie
将system
运算符的用法替换为对具有相同名称的sub的调用。子程序可以提供system LIST
语法和system BLOCK LIST
语法(通过使用原型),但不能同时提供两者。
$ perl -e'
CORE::say defined(prototype("CORE::system"))
? "Syntax can be emulated by subs."
: "Syntax can\x27t be emulated by subs."
'
Syntax can't be emulated by subs.
因此,当自动冲模替换system $SCALAR LIST
时,system BLOCK LIST
和system
不太常用的语法不可用。这是documented。
将
autodie
应用于system
或exec
会导致奇异形式或
system
{ $cmd } @args被视为语法错误,直到词法范围结束。如果确实需要使用奇异形式,则可以调用
exec
{ $cmd } @argsCORE::system
或CORE::exec
来代替,或者在调用奇异形式之前使用no autodie qw(system exec)
。