为什么用间接对象调用`system`仅使用autodie给出语法错误

时间:2019-05-12 09:23:54

标签: perl

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)"

为什么会这样?

2 个答案:

答案 0 :(得分:4)

来自autodie documentation

  

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' } 应用于autodiesystem会导致奇异形式execsystem { $cmd } @args被视为语法错误,直到词法范围结束。如果确实需要使用奇异形式,则可以调用exec { $cmd } @argsCORE::system来代替,或者在调用奇异形式之前使用CORE::exec

您所看到的完全是记录在案的内容。

答案 1 :(得分:4)

system运算符具有三种语法。

system LIST
system $SCALAR LIST
system BLOCK LIST

(与间接方法调用或对象完全无关。)

autodiesystem运算符的用法替换为对具有相同名称的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 LISTsystem不太常用的语法不可用。这是documented

  

autodie应用于systemexec会导致奇异形式system { $cmd } @argsexec { $cmd } @args被视为语法错误,直到词法范围结束。如果确实需要使用奇异形式,则可以调用CORE::systemCORE::exec来代替,或者在调用奇异形式之前使用no autodie qw(system exec)