diff --git a/src/main/java/org/perlonjava/codegen/Dereference.java b/src/main/java/org/perlonjava/codegen/Dereference.java index 08e538a9..66fcaf89 100644 --- a/src/main/java/org/perlonjava/codegen/Dereference.java +++ b/src/main/java/org/perlonjava/codegen/Dereference.java @@ -695,7 +695,21 @@ public static void handleArrowArrayDeref(EmitterVisitor emitterVisitor, BinaryOp emitterVisitor.ctx.mv.visitVarInsn(Opcodes.ASTORE, leftSlot); ArrayLiteralNode right = (ArrayLiteralNode) node.right; - if (right.elements.size() == 1) { + + // Check if this is a true array literal (contains only literal elements like strings and numbers) + // and has a single range operator in the indices + boolean isArrayLiteral = node.left instanceof ArrayLiteralNode leftArray && + leftArray.elements.stream().allMatch(elem -> + elem instanceof StringNode || + elem instanceof NumberNode) && + leftArray.elements.size() > 1; // Must have multiple literal elements + + boolean isSingleRange = right.elements.size() == 1 && + right.elements.getFirst() instanceof BinaryOperatorNode binOp && + "..".equals(binOp.operator); + + // Only apply the fix to true array literals with range operators + if (right.elements.size() == 1 && !(isArrayLiteral && isSingleRange)) { // Single index: use get/delete/exists methods Node elem = right.elements.getFirst(); elem.accept(emitterVisitor.with(RuntimeContextType.SCALAR));