当我运行以“#!/ usr / bin / perl -w”开头的文件时,出现错误:“第153行“ =〜?”附近的语法错误”

时间:2019-08-22 08:09:28

标签: perl

运行以#!/usr/bin/perl -w开头的文件时,出现错误:

  

第153行“ =〜?”附近的语法错误

我尝试添加“#!/ bin / bash”,此错误未附加,但是我得到另一个

  

错误:   “第34行:意外令牌'('”附近的语法错误

文件中的第153行:

($output_volume =~ ?^([\S]+).mnc?) && ($base_name = $1) ||
  die "sharpen_volume failed: output volume does not appear to be"
  ." a minc volume.\n";

第34行在我的文件中: 使用MNI :: Startup qw(nocputimes);

3 个答案:

答案 0 :(得分:9)

$output_volume =~ ?^([\S]+).mnc?

二手是有效的perl,因此可能会出现在旧的代码和说明材料中。

来自perlop

  

过去,m中的前m个?是可选的,但是省略它会产生弃用警告。从v5.22.0开始,省略它会产生语法错误。如果您在较早的代码中遇到此构造,则只需添加m。

答案 1 :(得分:8)

这是Perl代码,因此第一个错误消息是有意义的。

在match运算符中使用[TestFixture] public class DirectSoundTests { [Test] [Category("IntegrationTest")] public void CanEnumerateDevices() { foreach(var device in DirectSoundOut.Devices) { Debug.WriteLine(String.Format("{0} {1} {2}", device.Description, device.ModuleName, device.Guid)); } } } 以外的定界符时,您必须具有明确的//,因此

m

只有$output_volume =~ m?^([\S]+).mnc? 分隔符才可以省略//;来自Regex Quote-Like Operators (perlop)

  

如果m是定界符,则初始"/"是可选的。

有关正则表达式的教程介绍,请参见perlretut;有关参考,请参见perlre

还要注意,m的特定定界符在特殊情况下会触发特定的正则表达式行为。上面链接的?中文档部分的末尾对此进行了讨论。

答案 2 :(得分:5)

您已经有两个答案可以解释问题了。

  • ? ... ?不再是匹配运算符的有效语法。您需要使用m? ... ?
  • 直到Perl 5.22,您的语法都会生成警告。现在,这是一个致命错误(这就是您所看到的)。因此,我假设您现在正在更新版本的Perl上运行此程序。

但是,还有其他几点可能值得提出。

  1. 您说您尝试通过将文件的第一行从#!/usr/bin/perl -w更改为#!/bin/bash来进行调查。我不确定您怎么看这会有所帮助。该行定义了用于运行代码的程序。有了Perl代码后,您需要使用Perl运行它。尝试使用bash运行它很有用。
  2. m? ... ?(或以前的? ... ?)语法触发了晦涩而又特殊的行为。在我看来,您的情况并不需要这种行为,因此您可以将其更改为更常见的/ ... /
  3. 您的正则表达式包含一个未转义的点字符。假设您似乎是从具有扩展名的文件名中提取基本名,则似乎应该将其转义(使用\.),以使其与实际的点(而不是任何字符)匹配。
  4. 如果您正在使用此代码提取文件的基本名称,则使用正则表达式可能不是最佳方法。也许可以看看File::Basename