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

nov*_*ove 7 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";
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*awn 9

$output_volume =~ ?^([\S]+).mnc?
Run Code Online (Sandbox Code Playgroud)

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

佩洛普(Perlop)

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


zdi*_*dim 8

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

使用除//match运算符之外的定界符时,您必须具有明确m的标识符,因此

$output_volume =~ m?^([\S]+).mnc?
Run Code Online (Sandbox Code Playgroud)

仅使用//定界符m可以省略;来自Regex Quote-like运算子(perlop)

如果"/"是定界符,则缩写m是可选的。

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

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


Dav*_*oss 5

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

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

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

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